遅延コールバックが機能する方法は、コールバックを追加するたびに、そのコールバックが配列にプッシュされます。次に、遅延オブジェクトで.resolve()
or .resolveWith()
メソッドが呼び出されると.done()
、配列内のすべてのコールバックが順番に実行されます。
これで、遅延オブジェクトとは何かを見ることができます。例として以下のスニペットをご覧ください。
var deferred = $.Deferred();
var promise = deferred.promise();
これで、遅延オブジェクトと、遅延オブジェクトのpromiseオブジェクトができました。繰延オブジェクトしかし約束オブジェクトのみのメソッドをもつ、すべてを約束オブジェクトと同じ方法を有し.done()
、.fail()
及び.always()
それはそれぞれのための遅延オブジェクトにコールバックを追加するために使用されますevent
。一方、遅延オブジェクトには他にもいくつかのメソッドが.resolve()
あり.reject()
ます。最も重要なのはとです。これらのメソッドが遅延オブジェクトで呼び出されると、すべてのコールバックが呼び出されます。メソッドがコールおよびコールバックしている間に.resolve()
、.done()
および.always()
コールバックを起動します。.reject()
.fail()
.always()
通常、遅延オブジェクトはプライベートスコープ内に隠されたままになり、promiseオブジェクトは関数から返されるため、コールバックを配置できます。遅延オブジェクトは、ajaxリクエストが完了した後、イメージがロードされた後、setTimeoutの後など、後で解決されます。遅延オブジェクトは一度しか解決できないことを認識することも重要です。すでに解決されている場合、コールバックはすぐに呼び出されます。
私が使用する別の例はここにあります:
function loadImage(url) {
var def = $.Deferred(),
img = new Image();
$(img).on("load error",function(e){
if (e.type === "error") {
def.reject(url);
}
else {
def.resolve(url);
}
});
img.src = url;
// return the promise object so that callbacks can
// be defined on the deferred object.
return def.promise();
}
loadImage("foobar.jpg").done(function(){
alert("The image is loaded!");
}).fail(function(){
alert("The image failed to load!");
}).always(function(){
alert("This is always called!");
});
jQueryの$.Deferred()
メソッドと遅延オブジェクトの詳細については、http://api.jquery.com/category/deferred-object/をご覧ください。
Deferred
オブジェクトを意味しますか?これはNode.jsに固有のものですか?