В данный пример показано, как экспортировать переменную или функцию из пользовательского модуля. Как можно было экспортировать асинхронную функцию аналогичным образом, а затем вызывать ее из app.js примерно так:
// app.js
var things = require("./someThings");
await things.getSomeThingsAsync();
Обновлено:
Пример (ответ на 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.info(await things.doSomething());
Я пробовал несколько подходов, но всегда получаю:
SyntaxError: await is only valid in async function
Вероятно, это дубликат этого вопроса.
Вы можете просто преобразовать назначать функцию (или выражение функции) в имущество (или полностью) `модуль.экспорт’.
Например:
async function AsyncStuff () { ... }
module.exports.myAsyncThing = myAsyncStuff;
Вы можете попробовать это:
//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
}
Попробуй это
var things = require("./someThings");
let result = getResult();
async function getResult() {
return await things.getSomeThingsAsync();
}
Вы неправильно понимаете ошибку. Это говорит
SyntaxError: await is only valid in async function
не "асинхронная функция для"
С вашим экспортом проблем нет. Просто невозможно использовать await
вне функции, отмеченной async
. Поэтому ошибка в app.js
. Так должно быть:
var things = require("./someThings");
async function app () {
console.info(await things.doSomething());
}
app().then(() => console.info('done calling app()'));
Возможный дубликат Правильный экспорт асинхронной функции в node.js