Может ли следующая функция после Array.prototype.map () безопасно предположить, что все обратные вызовы в карте возвращены? - PullRequest
0 голосов
/ 13 октября 2018

Я знаю Array.prototype.map - синхронная операция.С другой стороны, если функция map является функцией обратного вызова (асинхронной), undefined немедленно вернется.

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

results = files.map(file => {
  fs.readFile(file, (err, data) => {
    if (err) throw err;
    return process(file) //will return the processed value, NOT a promise
  });
)
//I know results will be [undefined, undefined, undefined ...]
//But can I assume all the files have been processed if I reach here?
console.log('done')

Мне наплевать на возвращаемые значения.Вот почему я не хочу беспокоиться о await/async.Я просто хочу убедиться, что все функции обратного вызова вызваны и возвращены.Это возможно?

------- update --------

В дополнение к ответу, я нашел, что эти статьи также помогают мне понять проблему: https://medium.com/@antonioval/making-array-iteration-easy-when-using-async-await-6315c3225838
Использование async / await с циклом forEach

Мне нужно использовать обещание, чтобы убедиться, что все итераторы обратного вызова завершены.Таким образом, использование bluebird promise.map помогает уменьшить стандартные коды

1 Ответ

0 голосов
/ 13 октября 2018

Вы должны сделать функцию обратного вызова многообещающей, тогда вы можете использовать Promise.all:

 const results = Promise.all(files.map(file => new Promise(resolve => {
  fs.readFile(file, (err, data) => {
    if (err) throw err;
    resolve(process(file));
  });
 ));

 results.then(() => {
   console.log('done')
   //...
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...