为什么.catch()不会在异步函数的循环内捕获Promise构造函数中的reject(),除非传递错误?

时间:2017-08-01 06:44:50

标签: javascript promise async-await ecmascript-2017

给出



(async () => {
 const p = await new Promise((resolve, reject) => setTimeout(() => {
    reject(new Error(1))
  }, Math.floor(Math.random() * 1000))); return p})()
.then(data => console.log(data))
.catch(err => console.error(err));




Error()

记录.catch()

如果我们扩展模式以使用循环,Error会记录.catch()



const fn = async(res, ...props) => {
  for (let prop of props) res.push(await prop())
  return res
}

const arr = [
  () =>
    new Promise((resolve, reject) => 
      setTimeout(() =>
        reject(new Error(1))
      , Math.floor(Math.random() * 1000))
    ),
  () => 
    new Promise((resolve, reject) => 
      setTimeout(() => 
        resolve(1) 
      , Math.floor(Math.random() * 1000))
    )
  ];

fn([], ...arr)
.then(data => console.log(data))
.catch(err => console.log(err));




如果我们使用循环来调用多个函数,该函数返回Promise并且没有明确地将Error()传递给reject()构造函数Promise resolver函数.catch()未捕获错误,并且未返回数组res,只有传递给Promise的{​​{1}}值可在

获取



resolve()




问题:

  1. 为什么const fn = async(res, ...props) => { for (let prop of props) res.push(await prop()) return res } const arr = [ () => new Promise((resolve, reject) => setTimeout(() => reject(1) , Math.floor(Math.random() * 1000)) ), () => new Promise((resolve, reject) => setTimeout(() => resolve(1) , Math.floor(Math.random() * 1000)) ) ]; fn([], ...arr) // what happened to our array `res` returned from `fn`? .then(data => console.log(data)) // what happened to our rejected Promise? .catch(err => console.log(err)); 调用不会传播到reject(),而.catch()未在Error()内的reject()构造函数中明确传递给Promise async功能?

  2. 为什么只有一个Promise值返回.then(),尽管当async个对象之一迭代时,Promise函数返回一个数组在reject()构造函数Promise函数中调用循环resolver函数?

2 个答案:

答案 0 :(得分:4)

  

如果我们[...]没有明确地将Error()传递给Promise的reject()构造函数解析器函数.catch()没有捕获错误

当然,因为那时没有错误。但是catch会抓住您传递给reject的任何内容,即值1,它会被正确记录。

答案 1 :(得分:0)

尝试代码时,例如使用Promise的情况,并且预计会在.catch()记录错误,请明确传递Error(),最好将相关消息作为参数传递给reject()构造函数PromisePromise.reject();并使用console.error()替换console.log() .catch(),以区分您希望记录为Error()而不是已解决的Promise的错误} value,其中已解析和拒绝的值可能恰好相同。