【问题标题】:Promise.defer() browser supportPromise.defer() 浏览器支持
【发布时间】:2015-03-09 11:50:12
【问题描述】:

我正在寻找一种方法来创建将在当前范围之外解析的延迟对象。我喜欢延迟对象,正如我在 Chrome 38 中看到的 Promise.defer() 返回延迟对象。

但在最新的 Firefox 34 中,Promise.defer 在 Safari 8.0 中也未定义。

所以我现在不能在任何地方使用Promise.defer。未来状态如何?它会在其他浏览器中实现还是会被弃用?

【问题讨论】:

  • 如果你真的想的话,你可以使用 Promise 创建自定义的延迟对象。
  • 计划从 Chrome 以及 chain 中删除。
  • Promise.defer() 已停止在 Google Chrome 中为我工作。 (版本 52.0.2743.82)

标签: javascript cross-browser promise es6-promise


【解决方案1】:

根据the MDN article on Deferred.defer 方法已过时。如果您查看this bug issue,它会说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();
    });
});

新格式有几个优点,包括更简洁的代码和改进的 throw 安全性(如果 promise init 函数中的代码同步 throw,promise 将拒绝)。

【讨论】:

  • 值得一提的是 为什么 它被删除了 - 与 deferred 不同,promise 构造函数是安全的。如果你在 promise 构造函数的范围内抛出它,它会将它转换为你的拒绝。
  • @BenjaminGruenbaum,谢谢,我就是这个意思。
  • 但是,在构造函数之外的远处解决或拒绝承诺(延迟)的能力将丢失。
  • 那么当 promise 需要在构造函数之外被解析/拒绝时,我们现在该怎么办? dfsq 的答案?
【解决方案2】:

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

【讨论】:

  • 这被认为是 Promise 反模式,因为它不允许正确传播错误
  • @Alnitak 我知道,这就是为什么我说这不是一个好主意。我只是证明了实现延迟对象在技术上是可行的。
  • @Alnitak 它与错误的传播无关 - 您将延迟的反模式误认为是构造带有延迟的承诺。
  • @BenjaminGruenbaum 既然你在这里,那真的很有趣,你将如何回答 OP 问题?因为我的解决方案感觉很尴尬。
  • @dfsq 我赞成您的解决方案务实,Alexander O'Mara 提供的解决方案是正确的。我不确定我可以在此处进一步添加什么。
猜你喜欢
  • 2012-04-10
  • 2019-07-30
  • 2012-02-14
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多