Promise.defer() 浏览器支持

问题描述 投票:0回答:3

我正在寻找一种创建延迟对象的方法,该对象将在当前范围之外解析。我喜欢延迟对象,正如我所见,Chrome 38 中的

Promise.defer()
返回延迟对象。

但在最新的 Firefox 34 中

Promise.defer
在 Safari 8.0 中也是未定义的。

所以我现在不能到处使用

Promise.defer
。未来的地位又如何呢?它会在其他浏览器中实现还是会因弃用而被删除?

javascript cross-browser promise es6-promise
3个回答
36
投票

虽然我怀疑这是一个好主意,但从技术上讲,你可以基于 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);


28
投票

根据 关于 Deferred 的 MDN 文章

.defer
方法已过时。如果你看一下这个错误问题,它说
Promise.defer
是非标准的,所以它不太可能返回。

从 Gecko 30 开始,该对象已过时,不应再使用。请改用

new Promise()
构造函数。

他们提供了如何重写

Promise.defer
代码以代替使用
new Promise
的示例。

Promise.defer

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 将拒绝)。


0
投票

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());
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.