Promise.defer()浏览器支持

时间:2015-01-11 17:02:29

标签: javascript cross-browser promise es6-promise

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

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

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

2 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:19)

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