Node.js 模块:导出异步函数

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)

Le *_*ang 6

你可以试试这个:

//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)


sle*_*man 4

您误解了该错误。它说

语法错误: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)