Ertelenmiş ve söz


83

JQuery sürümleri dışındaki Ertelenmiş ve Söz arasındaki fark nedir?

İhtiyacım için ne kullanmalıyım? Ben sadece aramak istiyorum fooExecute(). Sadece ihtiyaç fooStart()ve fooEnd()örneğin html div statüsüne geçiş için.

//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }

$('#button1').on('click', function() {
    var deferred1 = $.Deferred();
    var promise1 = $.Promise();

    deferred1.???

    promise1.???
});


2
Sözün durumunu değiştiremezsin. Bu nedenle, talep mantığına (koşul mantığına müdahale etmekte hiçbir işi olmayabilir - çözmek veya reddetmek için) - çözümü beklemek - ertelenmiş olanı gerçekten yaratan fabrika mantığından ele alınır. Ertelenmiş edilebilir resolved ya da rejectonun söz da yansıtır durumunu değiştirerek ed. Tıklamalar için ertelenenleri nasıl kullanmak istediğinizi söyleyin?
Andrevinsky

Örneğinizin vaatlerden fayda sağlayacağını sanmıyorum (ya da anlamıyorum). Belki jQuery ertelendi nasıl kullanılabilir? .
Felix Kling

Yanıtlar:


131

Birincisi: Var olmadığı için kullanamazsınız $.Promise();.

Bir ertelenmiş nesne bir nesnedir oluşturmak bir söz ve onun durumunu değiştirme resolvedveya rejected. Ertelenmiş değerler, genellikle kendi işlevinizi yazarsanız ve arama koduna bir söz vermek istiyorsanız kullanılır. Siz değerin üreticisisiniz .

Bir söz , adından da anlaşılacağı gibi, gelecekteki değerle ilgili bir sözdür. Bu değeri elde etmek için geri aramalar ekleyebilirsiniz. Söz size "verildi" ve gelecekteki değerin alıcısı sizsiniz .
Sözün durumunu değiştiremezsiniz. Sadece kod oluşturulan kendi durumunu değiştirebilir vaadi.

Örnekler:

1. ( üretmek ) Kendi işlevleriniz için söz-destek sağlamak istediğinizde ertelenmiş nesneleri kullanırsınız. Bir değer hesaplarsınız ve sözün ne zaman çözüleceğini kontrol etmek istersiniz.

function callMe() {
    var d = new $.Deferred();
    setTimeout(function() {
        d.resolve('some_value_compute_asynchronously');
    }, 1000);
    return d.promise();
}

callMe().done(function(value) {
    alert(value);
});

2. ( ileri ) Kendisi bir vaat döndüren bir işlevi çağırıyorsanız, kendi ertelenmiş nesnenizi oluşturmanız gerekmez. Sözünü geri verebilirsin. Bu durumda, işlev değer yaratmaz, ancak onu iletir (bir tür):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});

3. ( alma ) Bazen vaatler / değerler oluşturmak veya iletmek istemezsiniz, onları doğrudan kullanmak istersiniz, yani bazı bilgilerin alıcısısınız:

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});

Tabii ki, tüm bu kullanım durumları da karıştırılabilir. İşleviniz değerin alıcısı olabilir (örneğin bir Ajax çağrısından) ve buna göre farklı bir değer hesaplayabilir (üretebilir).


İlgili sorular:


2

Söz, ertelenmiş koleksiyon tamamlandığında çalışan, ertelenmiş bir nesneye koyabileceğiniz bir şeydir.

JQuery belgelerinden örnek :

<!DOCTYPE html>
<html>
<head>
  <style>
div {
  height: 50px; width: 50px;
  float: left; margin-right: 10px;
  display: none; background-color: #090;
}
</style>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>

<button>Go</button>
<p>Ready...</p>
<div></div>
<div></div>
<div></div>
<div></div>


<script>
$("button").on( "click", function() {
  $("p").append( "Started...");

  $("div").each(function( i ) {
    $( this ).fadeIn().fadeOut( 1000 * (i+1) );
  });

  $( "div" ).promise().done(function() {
    $( "p" ).append( " Finished! " );
  });
});
</script>

</body>
</html>

İşte JSFiddle'da

Bu, her birinde bir işlev divçalıştırır ve .promisetüm .eachyürütmeler tamamlandığında kodu yürütür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.