我正在寻找一种创建延迟对象的方法,该对象将在当前范围之外解析。我喜欢延迟对象,正如我所见,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();
});
});
新格式有几个优点,包括更干净的代码和改进的抛出安全性(如果 Promise init 函数中的代码同步抛出,则 Promise 将拒绝)。
Promise.withResolvers() 已添加到规范中。请参阅这篇 MDM 文章
可以这样使用:
async function* readableToAsyncIterable(stream) {
let { promise, resolve, reject } = Promise.withResolvers();
stream.on("error", (error) => reject(error));
stream.on("end", () => resolve());
stream.on("readable", () => resolve());
while (stream.readable) {
await promise;
let chunk;
while ((chunk = stream.read())) {
yield chunk;
}
({ promise, resolve, reject } = Promise.withResolvers());
}
}