Promise.defer() 浏览器支持

Promise.defer() browser support

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

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

所以我现在不能到处使用 Promise.defer。未来状态如何?它会在其他浏览器中实现还是会因为弃用而被删除?

根据the MDN article on Deferred, the .defer method is obsolete. If you look at this bug issue,它说Promise.defer是非标准的,所以不太可能return。

Starting from Gecko 30, this object is obsolete and should not be used anymore. Use the new Promise() constructor instead.

他们提供了一个示例,说明如何重写 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 将拒绝)。

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