代码之家  ›  专栏  ›  技术社区  ›  guest271314

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

  •  4
  • guest271314  · 技术社区  · 7 年前

    (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

    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 并且不明确传递 错误() reject() 属于 许诺 resolver 作用 .catch() 不捕捉错误,数组 res 许诺 resolve() 可从以下网址获得:

    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)); 

    问题:

    1. 为什么 .catch() 未显式传递给 拒绝() 在内部 许诺 async 作用

    2. 为什么只有一个人 许诺 .then() 虽然数组是从 异步 许诺 在循环中迭代的对象 函数在中调用 许诺 建造师 分解器

    2 回复  |  直到 7 年前
        1
  •  4
  •   Bergi    7 年前

    如果我们[]未明确通过 Error() reject() 承诺构造函数分解器函数的 .catch()

    catch 会抓住你传给的任何东西 reject ,这是值 1 ,但记录正确。

        2
  •  0
  •   guest271314    7 年前

    在尝试代码时,例如 Promise .catch() ,显式传递 Error() ,最好以相关消息作为参数,以 reject() 属于 建造商或 Promise.reject() console.error() console.log() .catch() ,以区分预期记录为 而不是解决 许诺