对象如何通知其已经解决的承诺?

时间:2016-07-29 08:01:34

标签: javascript jquery

我的意思是,如果有一种方法可以让deffered对象通知它对状态变化的承诺,那么任何人都可以通过相同的方式触发附加到promise的回调。我想,我在推理中遗漏了一些东西,但我无法弄清楚到底是什么。

1 个答案:

答案 0 :(得分:2)

jQuery的Deferred返回的承诺无法访问解析机制; Deferred 中的解析机制可以访问promise和/或其注册的回调。

考虑:

// A D object is a bit like a Deferred
function D() {
  // All of these vars are private
  var state = "pending";
  var resolvedValue = null;
  var callbacks = [];
  // This is our promise, which is private
  var p = {
    then: function(callback) {
      callbacks.push(callback);
    }
  };
  
  // Accessor for our promise
  this.promise = function() {
    return p;
  };
  
  // Resolver -- note the promise object doesn't
  // offer any access to this, just the D
  this.resolve = function(value) {
    if (state === "pending") {
      state = "resolved";
      resolvedValue = value;
      // Note that the resolver has access to the callbacks
      // that the promise registers
      setTimeout(function() {
        callbacks.forEach(function(callback) {
          try {
            callback(resolvedValue);
          } catch (e) {
          }
        });
      }, 0);
    }
  };
}

// Usage
var d = new D();
d.promise().then(function(value) {
  console.log("Got " + value);
});
d.resolve("foo");

意味着是任何类型的真正延期实现,它只是为了演示延迟如何在没有承诺能够解决延迟的情况下访问承诺。

您可以查看jQuery Deferred in the source的完整详情。但请注意,jQuery的Deferred有点过时了;如今,拥有两个名称(DeferredPromise)的单独对象已不合时宜。相反,JavaScript Promise对象接受初始化函数,初始化函数接收可用于解析promise的解析器函数。 1

1 还有两个对象:通过调用初始化程序创建的promise和执行上下文,但这有点技术性......