在迭代对象属性时解析或拒绝承诺

时间:2017-04-07 17:54:08

标签: javascript promise es6-promise

我试图在迭代一些对象属性时拒绝一个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);
  }); 
}




我不知道我是否错过了一些愚蠢的东西,但我认为拒绝承诺应当在拒绝"被调用并打破剩余的代码执行,所以第一个代码应该工作。我有什么遗失的东西吗?

1 个答案:

答案 0 :(得分:2)

调用reject不会停止执行承诺,它只会将承诺的状态设置为rejected。它没有使承诺中断代码执行。 (但是,您稍后在调用resolve时遇到任何问题,因为承诺的状态只能从pending更改为rejected或{{1}完全一次)

如果要破坏代码执行,则需要使用fulfilled(或return reject(reason))。否则,promise将一直运行到其代码结束,然后然后将调用与promise相关联的任何return resolve(value)回调。这是预期的行为。另一种立即停止承诺执行的方法是抛出一个错误,这将导致承诺拒绝该错误。

因此,使原始代码有效的方法是:

.then