Функции JavaScript В Одном Файле Не Видят Друг Друга?

#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.