19

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

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

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

4

2 回答 2

33

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

于 2015-01-11T17:34:49.117 回答
28

根据有关 Deferred 的 MDN 文章,该.defer方法已过时。如果您查看此错误问题,它会说这Promise.defer是非标准的,因此不太可能返回。

从 Gecko 30 开始,此对象已过时,不应再使用。请改用new Promise()构造函数。

他们提供了一个如何重写Promise.defer代码的示例,而不是使用new Promise.

承诺延迟

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

于 2015-01-11T17:11:05.927 回答