我的意思是,如果有一种方法可以让deffered对象通知它对状态变化的承诺,那么任何人都可以通过相同的方式触发附加到promise的回调。我想,我在推理中遗漏了一些东西,但我无法弄清楚到底是什么。
答案 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
有点过时了;如今,拥有两个名称(Deferred
与Promise
)的单独对象已不合时宜。相反,JavaScript Promise
对象接受初始化函数,初始化函数接收可用于解析promise的解析器函数。 1
1 还有两个对象:通过调用初始化程序创建的promise和执行上下文,但这有点技术性......