Promise.defer() browser support

jus*_*ris 16 javascript cross-browser promise es6-promise

I am looking for a way to create deferred object which will be resolved outside the current scope. I like deferred objects and as I see Promise.defer() in Chrome 38 returns the deferred object.

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

所以我Promise.defer现在无法到处使用.未来地位怎么样?它会在其他浏览器中实现还是会被弃用?

Ale*_*ara 25

根据MDN关于延期的文章,该.defer方法已经过时.如果你看一下这个bug问题,它会说这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;
Run Code Online (Sandbox Code Playgroud)

新的承诺

return new Promise(function(resolve, reject) {
    doSomething(function cb(good) {
        if (good)
            resolve();
        else
            reject();
    });
});
Run Code Online (Sandbox Code Playgroud)

新格式有几个优点,包括更清晰的代码和更高的抛出安全性(如果promise init函数中的代码同步抛出,则promise将拒绝).

  • 值得一提的是_why_它被删除了 - promise构造函数与deferred不同.如果你抛出promise构造函数的范围,它会将它转换为拒绝. (13认同)
  • 但是,在构造函数旁边,远距离解析或拒绝承诺(延迟)的能力将丢失. (7认同)
  • 更完整的原因:[延迟().承诺和承诺之间的区别](http://stackoverflow.com/q/28687566/1048572) (2认同)
  • 那么当 Promise 需要在构造函数之外解析/拒绝时,我们现在该怎么办?dfsq的答案? (2认同)

dfs*_*fsq 20

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

  • @Alnitak我知道,这就是为什么我说这不是一个好主意.我只是证明了在技术上可以实现延迟对象. (2认同)