我正在寻找一种方法来创建将在当前范围之外解决的延迟对象。我喜欢延迟对象,正如我Promise.defer()
在 Chrome 38 中看到的那样返回延迟对象。
但在最新的 Firefox 34Promise.defer
中,Safari 8.0 中也未定义。
所以我现在不能Promise.defer
到处使用。未来状态如何?它会在其他浏览器中实现还是会被弃用?
我正在寻找一种方法来创建将在当前范围之外解决的延迟对象。我喜欢延迟对象,正如我Promise.defer()
在 Chrome 38 中看到的那样返回延迟对象。
但在最新的 Firefox 34Promise.defer
中,Safari 8.0 中也未定义。
所以我现在不能Promise.defer
到处使用。未来状态如何?它会在其他浏览器中实现还是会被弃用?
虽然我怀疑这是一个好主意,但从技术上讲,您可以基于 Promises 实现自定义延迟对象。例如:
function defer() {
var deferred = {};
var promise = new Promise(function(resolve, reject) {
deferred.resolve = resolve;
deferred.reject = reject;
});
deferred.promise = promise;
return deferred;
}
var deferred = defer();
deferred.promise.then(function(data) {
document.body.innerHTML += '<p>Resolved: ' + data + '</p>';
});
document.body.innerHTML = '<p>Deferred created.</p>';
setTimeout(function() {
deferred.resolve(123);
}, 2000);
根据有关 Deferred 的 MDN 文章,该.defer
方法已过时。如果您查看此错误问题,它会说这Promise.defer
是非标准的,因此不太可能返回。
从 Gecko 30 开始,此对象已过时,不应再使用。请改用
new Promise()
构造函数。
他们提供了一个如何重写Promise.defer
代码的示例,而不是使用new Promise
.
var deferred = Promise.defer();
doSomething(function cb(good) {
if (good)
deferred.resolve();
else
deferred.reject();
});
return deferred.promise;
return new Promise(function(resolve, reject) {
doSomething(function cb(good) {
if (good)
resolve();
else
reject();
});
});
新格式有几个优点,包括更简洁的代码和改进的 throw 安全性(如果 Promise init 函数中的代码同步 throw,则 Promise 将拒绝)。