2012-11-24 14 views
6

Bazı (diyelim 5) ajax istekleri jQuery.ajax işlevini kullanarak aynı anda çalıştırıyorum.jQuery ajax ve "ne zaman" işlevi

Şimdi, sonuçları eşitlemek ve birleştirmek istiyorum ve bunu başarmak için jQuery.when işlevini kullandım.

Benim sorunum, isteklerden biri başarısız olur olmaz ve diğerlerinin başarılı olsa bile geri dönmesini engeller dönmez $.when döndürmesidir.

Tüm ajax isteklerimden (başarısız olanlar ve başarılı olanlar) tüm sonuçları nasıl alabilir ve alabilirim? İlgili vaatlerle (ajax geri aramaları) tepkisini almak

+1

Geçerli kodunuzu gönderirseniz yardımcı olur .. – Nelson

cevap

0

Çalışma demo: http://jsbin.com/ocawoj/4/edit

function waitForAllPromisesToFinish() { 
    var i, 
     responses = [], 
     deferred = $.Deferred(), 
     helpers = { 
      addToResponses: function (index, data) { 
       responses[index] = data; 

       var i = 0, 
        isAnyNull = false; 

       for (i = 0; i < responses.length; i++) { 
        if (responses[i] === null) { 
         isAnyNull = true; 
         break; 
        } 
       } 

       if (isAnyNull === false) { 
        deferred.resolve(responses); 
       } 
      }, 
      setupPromise: function (promise, index) { 
       promise.always(function() { 
        var args = Array.prototype.slice.call(arguments); 
        helpers.addToResponses(index, args); 
       }); 
      } 
     }, 
     ajaxPromises = Array.prototype.slice.call(arguments); 

    for (i = 0; i < ajaxPromises.length; i++) { 
     responses[i] = null; 
    } 

    for (i = 0; i < ajaxPromises.length; i++) { 
     helpers.setupPromise(ajaxPromises[i], i); 
    } 

    return deferred.promise(); 
} 

fonksiyonu bir söz verir. Sağladığınız bir işleyiciden $ .when() öğesine biraz farklı bir işleyici eklersiniz. Fonksiyon her ajax sözünün cevaplarını takip eder. Tüm ajax vaatlerinin, ya başarı ya da başarısızlık verisi döndürdüğünü bulduğunda, bu sözünü çözecektir.

Aynı şeyi elde etmenin daha etkili yolları olabilir, ancak bu düşündüğüm ilk şey.

+0

Merhaba! Tam olarak aradığım şey bu gibi görünüyor! Ama dürüst olmak gerekirse, bu tür bir problemi çözmeye çalışan dünyadaki ilk insan olmadığımı düşündüğümden, bunu yapmak için daha "standart" bir yoldan gizlice bekledim. Her neyse, senden ve zaman ayırdığın için teşekkürler! :) –

+0

Sadece $ .when 'kodunun içinden geçtim ve yaptığım şey, $' nin ne yaptığına çok benziyor. Fark, ertelenenlerden herhangi birinin başarısız olduğu anda '$. Anlamlıdır, çünkü aksi halde ertelenenlerden herhangi birinin başarısız olup olmadığını nasıl anlarsınız? Başarıya veya başarısızlığa cevap verilip verilmediğini anlamak için her bir ertelenmişin resp değerini kontrol etmeniz gerekir. Bunu, hata izleyicilerinde bir bilet olarak yükseltebilir ve belki de çekirdek ekibin bunun nasıl ele alınması gerektiğini hissettiği konusunda bazı geri bildirimler alabilirsiniz. –

+0

Bir hata olmadığını kabul ediyorum, '$ .when' bu şekilde çalışıyor, mantıklı ve sorun değil. Sanırım, bu sadece bir özellik eksikliğidir, çünkü başarılı olursa olsun tüm sonuçları senkronize eden bir “whenAll” fonksiyonuna ihtiyaç duyduğumuz birçok durum vardır. Kutunun dışında bir işlev ya da bir geçici çözüm (daha önce çağırdığım gibi "standart" bir yol yoktur) olduğunu hayretle şaşırıyorum. –

0

bir, iki veya üç güncelleme fonksiyonlarını tanımlayan (eğer ne yapmak istediğinize bağlıdır) olabilir:

function bindPromises(updateSuccess, updateFail, updateAnyway) { 
    var arrPromises = []; 

    // automate the promise retrieval if you want, that's up to you. 
    arrPromises[0] = ajaxRequest1(); 
    arrPromises[1] = ajaxRequest2(); 
    arrPromises[2] = ajaxRequest3(); 
    arrPromises[3] = ajaxRequest4(); 
    arrPromises[4] = ajaxRequest5(); 

    for(var j = 0; j < arrPromises.length; j++) { 
     arrPromises[j].then(updateSuccess, updateFail, updateAnyway); 
    } 
} 

Yoksa bile otomatik hale getirmek isterseniz daha:

function bindPromises(arrayOfAjaxCalls, updateSuccess, updateFail, updateAnyway) { 
    var arrPromises = []; 

    for(var i = 0; i < arrayOfAjaxCalls.length; i++) { 
     arrPromises[i] = (arrayOfAjaxCalls[i])(); 
     arrPromises[i].then(updateSuccess, updateFail, updateAnyway); 
    } 
} 

seni bu özel konuyu kapsayan büyük bir yazıya işaret etmek istiyorum Promises aşina değilseniz: Understanding jQuery.Deferred and Promise

+0

Merhaba, eğer yanılıyorsam beni düzeltin ama bana göre kodunuz her bir ajax yanıtı için her geri çağrıyı yürütüyor değil mi? Lookig'im, tüm isteklerin tamamlanmasının (hepsi başarılı olursa olsun olmasın) bir yöntemin gerçekleştirileceği bir çözümdür. Bu yöntemden tüm ajax çağrı cevaplarını (başarısız olan ve başarılı olan) alabilmem gerekir. –

+0

Hayır, haklısın. Ancak, tüm çağrılar bitene kadar beklemek isteyip istemediğinize ya da her görüşme bittikten sonra bir miktar harekete geçmeye karar verdiğinizden emin değildim. Görünüşe göre şimdi her iki yaklaşım için de örnek var;) – nirazul

İlgili konular