SORU
6 Mart 2012, Salı


Ne zaman bir WordPress kullanmak's "ardından" yöntemi ertelenmiş kullanmalıyım ve ne zaman "boru" yöntemi kullanmalıyım?

Deferred jQuery fonksiyonları asenkron zincirleme uygulamak için kullanılan iki işlevi vardır:

then()

deferred.then( doneCallbacks, failCallbacks ) Returns: Deferred

doneCallbacksFonksiyonları dizisi, Ertelenmiş çözüldüğünde aradı.
failCallbacksFonksiyonları dizisi, Ertelenmiş reddetti aradı.

pipe()

deferred.pipe( [doneFilter] [, failFilter] ) Returns: Promise

doneFilterErtelenmiş olan isteğe bağlı bir işlev çözümlenir.
failFilterErtelenmiş olan isteğe bağlı bir işlev reddedilir.

then() ikincisi fazladan parası eklemek gerekir bu yüzden biraz pipe() daha uzun civarında olmuştur biliyorum, ama fark tam olarak ne olduğunu bulamıyorum. Hem adı ve Deferred dönen arasındaki fark, onlar farklı olsa da hemen hemen aynı geri arama ve parametreleri, ve Promise dönen çok az görünüyor.

Okudum resmi dokümanlar defalarca ama her zaman onları bulmak çok "yoğun" gerçekten wrap başımı ve arama bulunan birçok tartışma olan bir özellik veya diğer ama bulamadım henüz bir şey gerçekten açıklar farklı artılarını ve eksilerini her biri.

then kullanmak için daha çok zaman pipe kullanmak daha mı iyi?


Ayrıca

Felix's excellent answer gerçekten bu iki işlevi farklı nasıl açıklamak yardımcı oldu. Ama eğer then() işlevsellik pipe() bu tercih zamanları varsa merak ediyorum.

pipe() then() daha güçlüdür ve eski ikinci şeyi yapabilir gibi görünüyor. then() kullanmak için bir neden adını işlevleri aynı veri işleme zinciri fesih olarak rolünü yansıtan olabilir.

Ama 23**'pipe() ile nedeniyle yapılamayacak Deferred orijinal s *dönen 26* yeni dönen? gerektiren bir harf kullan

CEVAP
7 Mart 2012, ÇARŞAMBA


BerijQuery 1.8.then .pipe aynı şekilde davranır:

Admin Dikkat:JQuery 1.8, deferred.pipe() yöntemi önerilmiyor. Bunun yerine deferred.then() yöntemi, yerine kullanılmalıdır.

ve

JQuery 1.8 gibi, deferred.then() yöntemi döndürür bir işlev üzerinden ertelenen bir durum ve değerler, şimdi kullanım dışı deferred.pipe() yöntem yerine filtre yeni bir söz.

Aşağıdaki örnekler, hala bazıları için yararlı olabilir.


Bunlar farklı amaçlara hizmet eder:

  • .then() işlem sonucu ile çalışmak istediğiniz zaman kullanılır, Yani belgelere dediği gibi, ertelenmiş nesne çözülmüş ya da reddetti. .done() .fail() kullanarak aynı.

  • (Ön) .pipe() kullanmak istiyorumfiltresonuç bir şekilde. .pipe() bir geri dönüş değeri done fail geri aramalar için argüman olarak kabul edilecektir. Ayrıca başka bir ertelenmiş nesne döndürebilir ve aşağıdaki geri bu ertelenmiş kayıtlı olacak.

    .then() (ya da .done(), .fail()), kayıtlı aramalar değerleri sadece göz ardı edilir dönüşü ile durum böyle değil.

Kullandığınız değildirya.then()ya.pipe(). Sanaolabilir.then() aynı amaçlar için .pipe() ama bunun tersi geçerli değil.


Örnek 1

Bazı operasyon sonucu nesneleri dizisi

[{value: 2}, {value: 4}, {value: 6}]

ve değerleri minimum ve maksimum değerlerini hesaplamak. done aramaları kullanıyoruz varsayalım:

deferred.then(function(result) {
    // result = [{value: 2}, {value: 4}, {value: 6}]

    var values = [];
    for(var i = 0, len = result.length; i < len; i  ) {
        values.push(result[i].value);
    }
    var min = Math.min.apply(Math, values);

   /* do something with "min" */

}).then(function(result) {
    // result = [{value: 2}, {value: 4}, {value: 6}]

    var values = [];
    for(var i = 0, len = result.length; i < len; i  ) {
        values.push(result[i].value);
    }
    var max = Math.max.apply(Math, values);

   /* do something with "max" */ 

});

Her iki durumda da liste üzerinde yineleme ve her nesnenin değeri ayıklamak gerekiyor.

Hem geri aramaları tek tek bunu yapmak zorunda değilsiniz, böylece bir şekilde değerleri önceden ayıklamak için daha iyi olmaz mı? Evet! Ve bunun için .pipe() kullanabiliriz.

deferred.pipe(function(result) {
    // result = [{value: 2}, {value: 4}, {value: 6}]

    var values = [];
    for(var i = 0, len = result.length; i < len; i  ) {
        values.push(result[i].value);
    }
    return values; // [2, 4, 6]

}).then(function(result) {
    // result = [2, 4, 6]

    var min = Math.min.apply(Math, result);

    /* do something with "min" */

}).then(function(result) {
    // result = [2, 4, 6]

    var max = Math.max.apply(Math, result);

    /* do something with "max" */

});

Belli ki bu uydurma bir örnektir ve çok farklı (belki daha iyi) bu sorunu çözmek için yolları vardır, ama bu noktayı gösterir umarım.


Örnek 2

Ajax çağrıları göz önünde bulundurun. Bazen bir önceki tamamlandıktan sonra bir Ajax arama başlatmak istiyorum. Bir şekilde done bir geri arama içinde ikinci bir arama yapmak için:

$.ajax(...).done(function() {
    // executed after first Ajax
    $.ajax(...).done(function() {
        // executed after second call
    });
});

Şimdi, kod ayrıştır ve bir işlev içinde bu iki Ajax çağrıları koymak istiyorum varsayalım:

function makeCalls() {
    // here we return the return value of `$.ajax().done()`, which
    // is the same deferred object as returned by `$.ajax()` alone

    return $.ajax(...).done(function() {
        // executed after first call
        $.ajax(...).done(function() {
            // executed after second call
        });
    });
}

Ertelenmiş nesne makeCalls için geri takmak için çağıran başka bir kod izin vermek için kullanmak istiyorumikinciAjax çağrı, ama

makeCalls().done(function() {
    // this is executed after the first Ajax call
});

ikinci arama done bir geri arama içinde yapılır istenilen tepki ve erişilebilir dışarıdan değil.

Çözüm .pipe() yerine kullanmak olacaktır:

function makeCalls() {
    // here we return the return value of `$.ajax().pipe()`, which is
    // a new deferred/promise object and connected to the one returned
    // by the callback passed to `pipe`

    return $.ajax(...).pipe(function() {
        // executed after first call
        return $.ajax(...).done(function() {
            // executed after second call
        });
    });
}

makeCalls().done(function() {
    // this is executed after the second Ajax call
});

.pipe() kullanarak mümkün olan "Ajax çağrıları/sipariş. gerçek akış göstermeden çağrısı" iç için geri ekleme yapabilirsiniz


Genel olarak, ertelenmiş nesneleri kodunuz :) ayrıştır için ilginç bir yol sağlar

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Orson Wang

    Orson Wang

    28 EKİM 2006
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008
  • UniqueApps

    UniqueApps

    4 Ocak 2009