現在のスコープ外で解決される遅延オブジェクトを作成する方法を探しています。私は遅延オブジェクトが好きで、Promise.defer()
のChrome 38は遅延オブジェクトを返します。
しかし、最新のFirefox 34ではPromise.defer
もSafari 8.0では未定義です。
だから私はPromise.defer
どこでも今。将来の状況はどうですか?他のブラウザに実装されますか、それとも非推奨として削除されますか?
延期に関する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();
});
});
_
新しい形式にはいくつかの利点があり、コードがすっきりし、スローの安全性が向上しています(promise init関数のコードが同期してスローすると、promiseは拒否します)。
これは良い考えだとは思いませんが、技術的には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);