【问题标题】:Rejecting and then Resolving a Q Promise拒绝然后解决 Q Promise
【发布时间】:2023-03-17 13:20:02
【问题描述】:

我见过这样的代码:

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;

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

当我第一次看到这种模式时,我倾向于建议将 resolve 包含在 else 中,但既然它按原样工作,这是一种可以接受的模式吗?

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

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

【问题讨论】:

    标签: javascript promise q


    【解决方案1】:

    那么,无论哪个先发生,是什么“坚持”?

    是的,没错。一个承诺的状态在它被解决后是不可变的(要么完成要么被拒绝)。所以不,这里不可能发生问题,如果拒绝首先发生,则承诺被“锁定”为被拒绝。

    但是,请考虑一下单独的 else 是否实际上并不能提高您的代码质量。更少的代码行并不一定会提高代码的可读性!我会说它会,因为如果你看到 if/else 会更容易快速理解会发生什么。如果其他人必须查看您的代码,并且他们一开始也不知道承诺在解决后是不可变的怎么办?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 2020-09-12
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2020-04-15
      • 2019-04-17
      相关资源
      最近更新 更多