#javascript #node.js #asynchronous #async-await #promise
Вопрос:
Таким образом, у меня есть несколько функций, определенных в fileA.js
:
exports.doThis = async (a, b, c) => {
return Promise.all(a.map(item => doThat(item, b, c) ) )
}
exports.doThat = async (item, b, c) => {
console.log(`${b[1]} ${item} are good for ${c[0]`)
}
Я импортировал doThis
и doThat
ввез fileB.js
вот так:
const { doThis, doThat } = require('fileA')
const totallyDoingIt = async () => {
let a = ['apples', 'bananas', 'peaches']
let b = [1, 2, 3]
let c = ['Tom', 'Ryan', 'Suzy']
let startThingsOff = await doThis(a, b, c)
}
Я ожидаю, что doThis
это будет видно doThat
изнутри fileA.js
, но при запуске я получаю эту ошибку:
ReferenceError: doThat is not defined
Так как же я doThis
могу и doThat
видеть 2 apples are good for Tom
?
Комментарии:
1.
exports.doThat
определено,doThat
не определено.2. асинхронная функция по умолчанию возвращает обещания ,поэтому возврат обещания из асинхронной функции является избыточным
Ответ №1:
doThat
не является автономным идентификатором — это свойство module.exports
, поэтому ссылка на которое:
return Promise.all(a.map(item => exports.doThat(item, b, c) ) )
Комментарии:
1. Спасибо, сэр!
Tom is now eating his apples!
Ответ №2:
Если вы хотите ссылаться doThis
и doThat
использовать только этот идентификатор, вам придется определить функции как таковые. Один из способов сделать это-использовать обычные именованные функции.
// export name local name
exports.doThis = async function doThis(a, b, c) {
return Promise.all(a.map(item => doThat(item, b, c) ) )
};
exports.doThat = async function doThat(item, b, c) {
console.log(`${b[1]} ${item} are good for ${c[0]}`);
};
Другой вариант-сначала определить функцию, а затем экспортировать ее позже.
// define
const doThis = async (...) => { ... };
const doThat = async (...) => { ... };
// export
module.exports = { doThis, doThat };
// or
Object.assign(exports, { doThis, doThat });
// or
exports.doThis = doThis;
exports.doThat = doThat;
// etc.