Модуль Node.js: экспорт асинхронной функции - PullRequest
1 голос
/ 14 июня 2019

В приведенном примере показано, как экспортировать переменную или функцию из пользовательского модуля. Как можно экспортировать асинхронную функцию аналогичным образом, а затем вызвать ее из app.js, например:

// app.js

var things = require("./someThings");

await things.getSomeThingsAsync();

EDIT:

Пример (ответ по Stackoverflow), на который указывает вышеуказанная ссылка, содержит следующий код:

// someThings.js

(function() {
    var someThings = ...;

    ...

    module.exports.getSomeThings = function() {
        return someThings();
    }

}());

// main.js

var things = require("someThings");
...
doSomething(things.getSomeThings());

Скажем, внутри инкапсулированной функции модуля существует асинхронная функция, которую вы хотели бы показать любому, кто импортирует модуль. Например:

(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();
    }
}());

Как бы вы раскрыли функцию doSomething аналогично тому, как в исходном ответе она сделана для someThings - как можно изменить упомянутый ответ таким образом, чтобы при экспорте функций он позволял вам использовать ключевое слово await? Затем он будет использоваться как:

// app.js

var things = require("./someThings");

console.log(await things.doSomething());

Я пробовал несколько подходов, но всегда получаю:

SyntaxError: await is only valid in async function

Ответы [ 4 ]

1 голос
/ 14 июня 2019

Вы неправильно поняли ошибку. Это говорит

SyntaxError: ожидание допустимо только в асинхронная функция

не " для асинхронная функция"

Нет проблем с вашим экспортом. Просто невозможно использовать await вне функции, помеченной async. Поэтому ошибка в app.js. Должно быть:

var things = require("./someThings");

async function app () {
    console.log(await things.doSomething());
}

app().then(() => console.log('done calling app()'));
1 голос
/ 14 июня 2019

Вы можете попробовать это:


//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 hear
}
0 голосов
/ 14 июня 2019

Попробуйте это

var things = require("./someThings");
let result = getResult();
async function getResult() {
    return await things.getSomeThingsAsync();
}
0 голосов
/ 14 июня 2019

Вероятно, это дубликат этого вопроса.

Вы можете просто назначить функцию (или выражение функции) для свойства (или только полностью) ` module.exports '.

Например:

async function AsyncStuff () { ... }

module.exports.myAsyncThing = myAsyncStuff;
...