javascript - 延迟对象如何通知它已解决的 promise ?

标签 javascript jquery

我的意思是,如果延迟对象可以通过某种方式通知其关于状态更改的 promise ,那么任何人都可以通过相同的方式触发附加到 promise 的回调。我想,我在推理中遗漏了一些东西,但我无法弄清楚到底是什么。

最佳答案

jQuery 的Deferred 返回的promise 无法访问解析机制; 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");

不是意味着任何类型的真正的 Deferred 实现,它只是为了演示 deferred 如何在 promise 无法解析 deferred 的情况下访问 promise。

您可以查看 jQuery 的 Deferred 的完整详细信息 in the source .但是请注意,jQuery 的 Deferred 有点过时了;如今,拥有两个具有名称的独立对象(DeferredPromise)已经过时了。相反,JavaScript Promise 对象接受一个初始化函数,而该初始化函数接收一个可用于解析 promise 的解析器函数。1


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

关于javascript - 延迟对象如何通知它已解决的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38653549/

相关文章:

javascript - HTML5 - 如何绘制完成的 Canvas /图像

javascript - 将 Javascript 对象转换为 JSON 的 jQuery 方法是什么?

javascript - 谷歌可视化数据表仪表板中的总和列

javascript - 如何在 Angular 应用程序运行时将 ES6 代码转换为 ES5 代码

php - Javascript - If 条件由 "&&"分隔(需要建议)

javascript - 带停止按钮的倒计时

javascript - 如何使Flash影片与div宽度成比例缩放?

javascript - 根据用户输入创建编号表单

jquery - <p> 淡出后无法显示,这是怎么回事?

javascript - 如何创建停留 5 秒的加载弹出窗口