Ale*_*der 5 asynchronous node.js node-modules
在给定的示例中,演示了如何从自定义模块导出变量或函数。如何以类似的方式导出异步函数,然后从 app.js 调用它,如下所示:
// app.js
var things = require("./someThings");
await things.getSomeThingsAsync();
Run Code Online (Sandbox Code Playgroud)
编辑:
上述链接指向的示例(Stackoverflow 上的答案)包含以下代码:
// someThings.js
(function() {
var someThings = ...;
...
module.exports.getSomeThings = function() {
return someThings();
}
}());
// main.js
var things = require("someThings");
...
doSomething(things.getSomeThings());
Run Code Online (Sandbox Code Playgroud)
假设模块的封装函数内部存在一个异步函数,您希望将其公开给导入该模块的任何人。例如:
(function() {
...
const doSomethingAsync = (time) => {
return new Promise(resolve => {
setTimeout(() => resolve(42), time)
})
}
//const doSomething = async () => {
async function doSomething () {
let answer1 = await doSomethingAsync(3000)
let answer2 = await doSomethingAsync(1000)
return answer1 + answer2
}
...
/*module.exports.doSomething = function() {
return doSomething();
}*/
module.exports.doSomething = async function() {
return doSomething();
}
}());
Run Code Online (Sandbox Code Playgroud)
您将如何doSomething以与原始答案类似的方式公开该函数someThings- 如何以这样的方式更改引用的答案,即在导出函数时,它允许您使用关键字await?然后它将被用作:
// app.js
var things = require("./someThings");
console.log(await things.doSomething());
Run Code Online (Sandbox Code Playgroud)
我尝试了多种方法,但我总是得到:
SyntaxError: await is only valid in async function
Run Code Online (Sandbox Code Playgroud)
你可以试试这个:
//yourModule.js
let yourModule={};
yourModule.you=async()=>{
//something await...
}
modules.export = yourModule;
//app.js
let yourModule = require('<pathToModule>');
async function test()
{
await yourModule.you(); //your `await` here
}
Run Code Online (Sandbox Code Playgroud)
您误解了该错误。它说
语法错误:await 仅在异步函数中有效
不是“用于异步函数”
你的导出没有问题。根本不可能await在标记为 的函数之外使用async。因此,该错误位于app.js. 它应该是:
var things = require("./someThings");
async function app () {
console.log(await things.doSomething());
}
app().then(() => console.log('done calling app()'));
Run Code Online (Sandbox Code Playgroud)