我正在寻找一种创建延迟对象的方法,该方法将在当前范围之外解析。我喜欢延迟对象,因为我在Chrome 38中看到Promise.defer()
会返回延迟对象。
但是最新的Firefox 34 Promise.defer
在Safari 8.0中也未定义。
所以我现在无法在任何地方使用Promise.defer
。未来地位怎么样?它会在其他浏览器中实现还是会被弃用?
答案 0 :(得分:24)
根据the MDN article on Deferred,.defer
方法已过时。如果您查看this bug issue,则表示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();
});
});
新格式有几个优点,包括更清晰的代码和更高的抛出安全性(如果promise init函数中的代码同步抛出,则promise将拒绝)。
答案 1 :(得分:19)
虽然我怀疑这是一个好主意,但从技术上讲,你可以基于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);
&#13;