我正在寻找一种创建延迟对象的方法,该对象将在当前范围之外解决。我喜欢延迟对象,正如我在Chrome 38中看到的Promise.defer()
返回延迟对象。
但是在最新的Firefox 34中,Promise.defer
是未定义的,同样在Safari 8.0中也是如此。
因此,现在我无法在所有地方使用Promise.defer
。未来会怎么样呢?它会被其他浏览器实现,还是会被删除作为不推荐使用的内容?
我正在寻找一种创建延迟对象的方法,该对象将在当前范围之外解决。我喜欢延迟对象,正如我在Chrome 38中看到的Promise.defer()
返回延迟对象。
但是在最新的Firefox 34中,Promise.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);
.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函数中的代码同步抛出异常,promise将会被拒绝)。
chain
中移除。 - Benjamin Gruenbaum