【发布时间】:2017-04-08 02:08:04
【问题描述】:
我在迭代某些对象属性时尝试拒绝一个承诺,但即使在调用拒绝方法后执行仍在继续(“通过这里!!!”即使在拒绝后也已登录控制台)。
function updateDocumentWithNewData(document, newData) {
return new Promise(function(resolve, reject) {
//some code...
for (let key in newData) {
if (newData.hasOwnProperty(key)) {
//verifying if the document already has the property
if (document.hasOwnProperty(key)) {
reject({'message' : 'a property already exists...'});
}
//some code...
}
}
//some more code...
console.log("passed here!!!");
resolve(document);
});
}
我正在调用返回此承诺的方法,如下所示:
updateDocumentWithNewData(doc, data).then(function(result) {
//Some code
}).catch(function(err) {
//Some code
});
解决方案是使用布尔变量,只有在循环结束后才调用“reject”方法:
function updateDocumentWithNewData(document, newData) {
return new Promise(function(resolve, reject) {
//some code...
let invalidUpdate = false;
for (let key in newData) {
if (newData.hasOwnProperty(key)) {
//verifying if the document already has the property
if (document.hasOwnProperty(key)) {
invalidUpdate = true;
break;
}
//some code...
}
}
if (invalidUpdate) {
reject({'message' : 'a property already exists...'});
}
//some more code...
console.log("passed here!!!");
resolve(document);
});
}
我不知道我是否遗漏了一些愚蠢的东西,但我认为 Promise 的拒绝应该在调用“reject”时立即返回并中断剩余的代码执行,所以第一个代码应该可以工作。有什么我遗漏的吗?
【问题讨论】:
标签: javascript promise es6-promise