拒绝然后解决Q承诺

时间:2014-11-04 19:59:32

标签: javascript promise q

我见过这样的代码:

var defer = Q.defer();
// do something, here's the callback
if (err) {
   defer.reject({err: err})
}
defer.resolve({success: data});
// close callback
return defer.promise;

如果承诺首先被拒绝,然后解决,那么“拒绝”似乎仍然存在。

当我第一次看到这种模式时,我倾向于建议将解决方案包含在else内,但由于它按原样工作,这是否可以接受?

拒绝然后解决承诺会不会有问题?

看来,如果您解决然后拒绝,则解决方案仍然存在。那么首先发生的是什么“坚持”?

1 个答案:

答案 0 :(得分:1)

  

所以先发生哪种情况,是什么“坚持”?

是的,确切地说。承诺的状态一旦确定(完全填写或拒绝)就是不可变的。所以不,这里不会出现问题,如果先拒绝,承诺会被“锁定”为拒绝。

但是,请考虑一下其他内容是否真的无法提高您的代码质量。较少的代码行不一定能提高代码的可读性!我会这么说,因为如果你看到if / else,快速了解会发生什么更容易。如果其他人必须查看你的代码,并且他们起初也不知道承诺在结算后是不可变的呢?

Chapter 3 of "You Don't Know JS (async & performance)"是更好地掌握承诺的绝佳资源。 Q符合的Promises A+ specification也是如此。后者更像是一个“客观的事实来源”,但它更难以阅读(嗯,这是一个规范)。