我实际上是使用链式承诺编写一些函数,而且我在处理它们时遇到了一些麻烦。
实际上,这是我想要避免的反模式:
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);
});
事实是,我完全不知道我的被拒绝的承诺会采取行动。似乎我的单元测试都在这个重构后破坏了,我不明白为什么。也许这种行为......
实际上,我的(错误)回调是否包含(错误的)被拒绝的值,还是会完全中断并直接返回承诺?
感谢您的帮助。
编辑:好的,我会尝试另一个例子。让我们想象一下,我需要通过在每个可能的级别捕获每个可能的错误来异步地进行一些算术运算 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 ');
});
拒绝的第一个承诺是否会破坏链中的所有其他承诺?还是会继续?
答案 0 :(得分:2)
(error)=>{return Promise.reject(error);}
错误回调与(result)=>{return result;}
成功回调一样无用。与then
一起使用时,它是一个标识。你可以简单地省略它们:
return promise.then(res => promise2);
似乎我的单元测试在这个重构后都破裂了,我不明白为什么。
您发布的两个片段将获得相同的结果。它们的确切流量可能有点不同,例如当Promise.reject
被拒绝时,promise
在第二个示例中被调用两次,但如果promise
和promise2
都是Promises / A +语义的标准承诺,那么这一点无关紧要。< / p>
好吧我会尝试另一个例子。让我们想象一下,我需要在每个可能的级别捕获每个可能的错误,以异步方式进行一些操作
是的,它在这里确实有很大的不同。在多个级别上捕获错误并明确地处理它们将产生不同的结果。错误处理程序将处理承诺上的所有错误,即在其上方的完整链中(但不在同一scuccess
调用的then
回调中),请参阅{ {3}}了解详情。
我相信你实际上正在寻找
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');
});
});