我试图在迭代一些对象属性时拒绝一个promise,但是即使在调用reject方法之后执行仍然继续("在这里传递!!!"在控制台中记录,即使在拒绝之后)。
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
});

解决方案是使用布尔变量,并调用"拒绝"循环结束后的方法:
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);
});
}

我不知道我是否错过了一些愚蠢的东西,但我认为拒绝承诺应当在拒绝"被调用并打破剩余的代码执行,所以第一个代码应该工作。我有什么遗失的东西吗?
答案 0 :(得分:2)
调用reject
不会停止执行承诺,它只会将承诺的状态设置为rejected
。它没有使承诺中断代码执行。 (但是,您稍后在调用resolve
时遇到任何问题,因为承诺的状态只能从pending
更改为rejected
或{{1}完全一次)
如果要破坏代码执行,则需要使用fulfilled
(或return reject(reason)
)。否则,promise将一直运行到其代码结束,然后然后将调用与promise相关联的任何return resolve(value)
回调。这是预期的行为。另一种立即停止承诺执行的方法是抛出一个错误,这将导致承诺拒绝该错误。
因此,使原始代码有效的方法是:
.then