Обработка ошибок в Promise.all - сделать результат одного Promise доступным в другом Promise? - PullRequest
1 голос
/ 07 мая 2019

Я пишу простой скрипт сборки, который компилирует некоторые файлы.Единственная оставшаяся проблема - обработка ошибок.Это работает, но я хочу добавить дополнительный контент к сообщениям об ошибках.Вот фрагмент кода, о котором идет речь:

const promises = []

for (let file of files) {
  promises.push(Promise.all([exec(compile(file)), Promise.resolve(file)]))
}

Promise.all(promises.map(p => p.catch(e => console.log(e))))
.then(result => {
  /* result is now an array with the following pattern:
     [[stdout, filename], [stdout, filename], ...]
   */
});

Функция exec возвращает некоторые stdout данные, которые не указывают, какой файл использовался.Поэтому я добавил Promise.all, содержащий как функцию exec, так и обещание, которое немедленно разрешает и возвращает имя файла.Мне нужны данные, возвращаемые из exec, и имя файла, когда мне нужно записать файлы в систему.Поскольку я все еще хочу, чтобы последний then работал независимо от каких-либо ошибок, я обрабатываю ошибки для каждого файла отдельно (отсюда .map).Единственная проблема заключается в том, что stdout из exec не ссылается на используемый файл.Так что сообщения об ошибках запутываются.Я хотел бы что-то вроде следующего:

p.catch(e => console.log(`error happened in ${file}:`, e))

Я не уверен, как я могу получить доступ к переменной файла из catch.Есть идеи?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Возможно, вы захотите поместить catch в цикл, где соответствующий file все еще находится в области видимости:

Promise.all(files.map(file => 
  Promise.all([
    exec(compile(file)).catch(e => console.log(`error happened in ${file}:`, e)),
    file
  ])
)).then(result => {
  /* result is now an array with the following pattern:
     [[stdout/undefined, filename], [stdout/undefined, filename], ...]
   */
});
1 голос
/ 07 мая 2019

При вызове функции вы должны непосредственно добавить улов:

  for (let file of files) {
    promises.push(
       exec(compile(file))
         .then(result => [result, file])
         .catch(error => [error, file])
    );
  }

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