的承诺.all - resolve回调会被触发,尽管Promise被拒绝
Promise.all – resolve callback fires although a Promise is rejected
在摆弄Promises以理解它们是如何工作的时候,我注意到一些我无法解释的东西。
给定这个例子:
var A = function () {
return Promise.resolve();
};
var B = function () {
return Promise.reject();
};
var c = A();
var d = B();
c.then(
function () { console.log('A success'); },
function () { console.log('A fail'); }
);
d.then(
function () { console.log('B success'); },
function () { console.log('B fail'); }
);
Promise.all([c, d]).then(
function () { console.log('all success'); },
function () { console.log('all fail'); }
);
首先触发单个resolve/reject回调,然后是拒绝Promise.all
的回调。这是预期的,因为B
拒绝了承诺。
但是当像这样写时,Promise.all
的resolve回调触发:
var A = function () {
return Promise.resolve();
};
var B = function () {
return Promise.reject();
};
var c = A().then(
function () { console.log('A success'); },
function () { console.log('A fail'); }
);
var d = B().then(
function () { console.log('B success'); },
function () { console.log('B fail'); }
);
Promise.all([c, d]).then(
function () { console.log('all success'); },
function () { console.log('all fail'); }
);
这是意外的,因为两个Promise中的一个被拒绝了,所以all
返回的Promise也应该被拒绝。
这里发生了什么-它与返回值有关吗?我需要在某个地方返回一个新的承诺吗?
你的两个例子看起来很相似,但并不完全相同。以下是then
的文档(重点是我的):
调用
onFulfilled
或onRejected
,使用承诺的履行值或拒绝原因(酌情),并返回一个新的承诺,解析为所调用处理程序的返回值。
在你的第一个例子中,d
被设置为B()
的结果,这是一个被拒绝的承诺。一个新的承诺意味着记录了一些东西,但d
没有改变。
在第二个示例中,d
被更改为B().then(...)
的结果,这是一个已解决的承诺。
您可能希望在拒绝处理程序中设置throw
。
你正在抑制第二种情况下的错误:
// d is promise which suppressed error from B()
var d = B().then(
function () { console.log('B success'); },
function () { console.log('B fail'); }
);
如果你想让d
也被拒绝,你应该重新抛出错误:
var d = B().then(
function () { console.log('B success'); },
function (e) { console.log('B fail'); throw e; }
);
相关文章:
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 尽管链接成功并已成功下载,但未找到NPM模块
- 在流星上使用微信js-sdk时出现拒绝权限错误
- 看到“;未捕获的类型错误:无法读取属性'weight'未定义的“;尽管按照字面上的指示
- 在Nodejs中Express输入DEBUG=app时权限被拒绝/bin
- Angular ngRepeat:重复错误(尽管没有重复的密钥)
- 简单的ES6承诺问题-交换解决和拒绝参数
- javascript第三个XMLHttpRequest被拒绝.但前两个是允许的
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- Facebook FB.init”;访问被拒绝”;在Internet Explorer 11中
- 未处理的拒绝MongoError:无法连接到MongoDB中的服务器
- Node.js solrProxy访问被拒绝
- 使用jquery创建dom元素会导致ie9出现拒绝访问错误
- CKeditor预览插件.js,为Chrome和IE进行编辑.因为它拒绝CSS样式
- 节点,express应用程序返回text/javascript响应头(Content-Type),尽管设置了applic
- 在$q服务中捕获拒绝而不触发成功回调
- Javascript-Uncaught一个承诺被拒绝了,尽管它已经被拒绝了
- 尽管来源相同,XMLHttpRequest响应访问被拒绝
- 的承诺.all - resolve回调会被触发,尽管Promise被拒绝
- 流星更新访问被拒绝,尽管存在不安全