繁体   English   中英

es6的多个Promise.reject

[英]Multiple Promise.reject with es6

我实际上是使用链接的promise编写某些函数的,而在处理它们时遇到了一些麻烦。

实际上,这是我要避免的反模式:

  return promise.then((res)=>{
    return promise2.then((result)=>{
      return result;
    },(error)=>{
      return Promise.reject(error);
    });
  },(err)=>{
    return Promise.reject(err);
  });

我尝试了以下重构:

  return promise.then((res)=>{
    return promise2;
  },(err)=>{
    return Promise.reject(err);
  }).then((result)=>{
    return result;
  },(error)=>{
    return Promise.reject(error);
  });

事实是,我完全不知道我所有被拒绝的诺言都会兑现。 重构之后,我的单元测试似乎全部崩溃了,我不明白为什么。 也许是行为...

实际上,我的(错误)回调是否包含(错误)拒绝的值,还是会完全中断并直接返回promise?

谢谢你的帮助。

编辑:好的,我将尝试另一个示例。 假设我需要通过捕获每个可能级别的每个可能错误来异步进行一些算术运算

  asyncAddition(5, -5).then((res)=>{
    return asyncDivide(100, res);
  },(err)=>{
    return Promise.reject('ERROR, you cant divide by 0');
  }).then((res)=>{
    return asyncMultiply(res, 10);
  }).then((res)=>{
    return res;
  },(err)=>{
    return Promise.reject('An error occured, number result is over 1000 ');
  });

被拒绝的第一个诺言是否会破坏链条中的所有其他诺言? 还是会继续?

(error)=>{return Promise.reject(error);}错误回调与(result)=>{return result;}成功回调一样无用。 then ,它是一个身份。 您可以简单地忽略它们:

return promise.then(res => promise2);

重构之后,我的单元测试似乎全部崩溃了,我不明白为什么。

您发布的两个代码片段将具有相同的结果。 其确切的流量可能会有点不同的,例如Promise.reject当被称为在第二个例子中两次promise被拒绝,但如果双方promisepromise2是标准的承诺与承诺/ A +语义那么这一定不是问题。

好吧,我会再举一个例子。 假设我需要通过捕获每个可能的级别上的每个可能的错误来异步进行一些操作

是的,在这里确实有很大的不同。 在多个级别上捕获错误并加以区别对待,将产生不同的结果。 错误处理程序将处理所有的错误上一个承诺,那就是在它上面的完整链条(但不是在scuccess相同的回调then调用,见之差.then(…).catch(…).then(…, …)了解详情)。

我相信您实际上正在寻找

asyncAddition(5, -5).then(res => {
    return asyncDivide(100, res).catch(err =>{
        throw new Error('ERROR, you cant divide by 0');
    });
}).then(res => {
    return asyncMultiply(res, 10).catch(err => {
        throw new Error('An error occured, number result is over 1000');
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM