Ertelenmiş geri aramanın çalışma şekli, her geri arama eklediğinizde, bu geri aramanın bir diziye aktarılmasıdır. Sonra, ertelenmiş nesnede .resolve()
veya .resolveWith()
yöntemi çağrıldığında .done()
, dizideki tüm geri çağrılar sırayla yürütülür.
Şimdi Ertelenmiş Bir Nesnenin ne olduğuna bakabiliriz. Örnek olarak aşağıdaki kod parçasını ele alalım.
var deferred = $.Deferred();
var promise = deferred.promise();
Şimdi sahip olduğumuz şey ertelenmiş bir nesne ve ertelenmiş nesnenin vaat nesnesidir. Ertelenmiş bir amacı, ancak söz nesnesi yalnızca yöntemleri vardır, her söz nesne ile aynı yöntemler vardır .done()
, .fail()
ve .always()
her hangi ilgili ertelenmiş nesnesine geri aramalar eklemek için kullanılır event
. Ertelenmiş nesnenin diğer birçok yöntemi vardır, en önemlisi .resolve()
ve .reject()
. Ertelenmiş nesnede bu yöntemler çağrıldığında, tüm geri çağrılar çağrılır. .resolve()
patlar .done()
ve .always()
süre geri aramalar .reject()
yöntem çağrıları .fail()
ve .always()
geri aramalar.
Genellikle ertelenen nesne özel bir kapsam içinde gizli tutulur ve söz verilen nesne, geri çağrıların üzerine yerleştirilebilmesi için işlevden döndürülür. Ertelenmiş nesne daha sonra, örneğin bir ajax isteği tamamlandıktan sonra veya bir görüntü yüklendikten sonra, bir setTimeout, vb. Sonra çözülecektir. Ertelenmiş bir nesnenin yalnızca bir kez çözülebileceğini fark etmek de önemlidir. Zaten çözülmüşse, geri aramalar hemen çağrılacaktır.
İşte benim kullandığım başka bir örnek:
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()
yöntemi ve ertelenmiş nesneler hakkında daha fazla bilgi için http://api.jquery.com/category/deferred-object/ adresini ziyaret edin.
Deferred
nesneleri Bu Node.js'ye özgü bir şey mi?