Модуль Node.js: экспорт асинхронной функции

В данный пример показано, как экспортировать переменную или функцию из пользовательского модуля. Как можно было экспортировать асинхронную функцию аналогичным образом, а затем вызывать ее из 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

Возможный дубликат Правильный экспорт асинхронной функции в node.js

Erin Eland 14.06.2019 08:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
13 774
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы можете просто преобразовать назначать функцию (или выражение функции) в имущество (или полностью) `модуль.экспорт’.

Например:

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

Другие вопросы по теме