2012-08-29 17 views
6

Kodumda, bir dizi işlev çağrım var. Bu çağrıların üstesinden geliyorum ve onları aramak için .apply() kullanın. Sorun, yeni işlev çağrısı herhangi bir zaman alırsa, döngü .apply() işlevini ve önceki işlev bitmeden önce bir sonraki işlevi çağırmasıdır. >. Bir geri arama uygulamak işlevini olmadığını.apply() yöntemine nasıl bir geri arama ekleyebilirim?

function someFunc(element, calls){ 
    if(calls.length){ 
    fn = calls[0]; 
    calls.shift(); 
    fn.apply(element, args); 
    someFunc(element, calls); 
    } 
} 

Öyleyse bu ben istiyorum nasıl işe yarayabilir: < İşte bir örnek.

function someFunc(element, calls){ 
    if(calls.length){ 
    fn = calls[0]; 
    calls.shift(); 
    fn.apply(element, args, function(){ 
     someFunc(element, calls); 
    }); 
    } 
} 

Ayrıca bir geri arama işlevinin içinde someFunc çağrılması hakkında bir sorum var. calls dizimdeki işlevler benim element değişkenimi etkiler. Bu yüzden, değiştirildikten sonra, bir sonraki işlevin de bunu değiştirebilmesinden dolayı, geri aramada bazıFunc'a geçtiğinden emin olmak istiyorum. Bazen sadece this bağlamıyla karıştırıldım. :)

Eğer yardımcı olursa jQuery kullanıyorum. JQuery yöntemlerine nasıl geri arama ekleyebileceğimi biliyorum, ancak yerel JavaScript koduyla uğraşırken bunu nasıl yapacağımı bilmiyorum. .apply() yöntemine nasıl bir geri arama ekleyebilirim?

+1

Tüm işlevlerinizin izlediği bir parametre kalıbı bilmedikçe, istediğinizi yapmaya imkan yoktur. – Pointy

+0

@Pointy - Parametrelerimin tümünü "args" dizisine koyarsam neden bir parametre modeline ihtiyacım olurdu? – Aust

+0

Sorun, bir işlevin zaman uyumsuz olup olmadığını ve bir geri arama işlevi parametresini (veya bu tür iki parametreyi veya daha fazlasını) kabul edecek şekilde tasarlanıp tasarlanmadığını anlamanın bir yolu olmamasıdır. Sistemin bir işlev için "beklemesini" ve zaman uyumsuz takibini bitirmesi için yapamazsınız. Böylelikle eğer * bilirseniz * işlevlerinizin tümü (örneğin) son parametre olarak geri arama yaparsanız, o zaman bir şeyleri halledebilirsiniz. – Pointy

cevap

2

Aradığınız her işlevin bir promise döndürdüğünden emin olun. Her işlev ile

function someFunc(element, calls) { 
    if (calls.length) { 
     var fn = calls.shift(); 
     fn.apply(element, args).done(function(el) { // what's args? 
      el = el || element; // default to previous element if necessary 
      someFunc(el, calls); 
     }); 
    } 
} 

gibi bir şey arıyorum: asenkron görev ise

function myFunc1(el) { 
    var def = $.Deferred(); 

    // do something async, and "resolve" the deferred object in the async callback 
    ...(function() { 
     def.resolve(el); // this "el" will get passed to the next function 
    }); 

    return def.promise(); 
} 

Daha sonra listedeki bir sonraki fonksiyonu ile devam etmeden önce "çözülmesini" için bu sözü için "bekle" olabilir Bir AJAX çağrısı, yeni bir ertelenmiş nesne oluşturmak yerine $.ajax'un jqXHR sonucunu doğrudan döndürebilirsiniz.

+0

"Çağrılar" değişkeme geçtiğim bazı işlevler benim değilse, nasıl ekleyeceğim? $.Ertelenmiş() nesne mi? Başka bir işleve sarılabilir miyim, yoksa bu mümkün mü? – Aust

+0

Evet, işlevleri kapatabilirdiniz, ancak _somehow_ hala varoluşunuzu çözmeniz gerekiyor ve async geri çağrısında yapılması gerekiyor. – Alnitak

+0

Bu yüzden, sarsam bile, @Point'in getirdiği asıl soruna geri dönüyorum? Yani, eğer bir fonksiyonun bir geri çağrısı yoksa, o zaman istediğim şey imkansız mıdır? – Aust