web-dev-qa-db-ja.com

Promise.defer()ブラウザーのサポート

現在のスコープ外で解決される遅延オブジェクトを作成する方法を探しています。私は遅延オブジェクトが好きで、Promise.defer()のChrome 38は遅延オブジェクトを返します。

しかし、最新のFirefox 34ではPromise.deferもSafari 8.0では未定義です。

だから私はPromise.deferどこでも今。将来の状況はどうですか?他のブラウザに実装されますか、それとも非推奨として削除されますか?

17
just-boris

延期に関するMDNの記事 によると、_.defer_メソッドは廃止されています。 このバグの問題 を見ると、_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は拒否します)。

26

これは良い考えだとは思いませんが、技術的にはPromiseに基づいてカスタム遅延オブジェクトを実装できます。例えば:

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);
23
dfsq