Promise.all错误处理-使一个Promise的结果可以在另一个Promise的捕获中访问吗?

时间:2019-05-07 17:58:34

标签: javascript asynchronous error-handling promise

我正在编写一个简单的构建脚本来编译一些文件。剩下的唯一问题是错误处理。它可以工作,但是我想在错误消息中添加其他内容。这是相关代码的片段:

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函数和一个promise,它们可以立即解析并返回文件名。当我需要将文件写入系统时,我需要从exec返回的数据和文件名。因为无论任何错误,我仍然希望最后一个then运行,所以我分别处理每个文件的错误(因此,.map)。唯一的问题是stdout中的exec没有引用它使用的文件。因此错误消息变得混乱。我想要以下内容:

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

我不确定如何从catch中访问文件变量。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您应在调用函数时直接添加捕获:

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

  Promise.all(promises).then(results => {
    //...
  });

答案 1 :(得分:1)

您可能希望将Allow放在相应catch仍在范围内的循环中:

file