2012-07-14 35 views
2

當使用第三方庫(如jQuery)時,我一直使用回調,但是我遇到了需要設置自己的回調的問題。通過上課「mainRow」的所有錶行如何對javascript中的用戶函數執行自定義回調

// Get All Rates 
function getAllRates() { 
    $('#shiplist tr.mainRow').each(function() { 

     var curid = $(this).attr("id"); 
     var cursplit = curid.split("_"); 
     var shipid = cursplit[1]; 

     getRate(shipid); 

    }); 

} 

這種迭代,並且每個主行都有ID爲「出貨_ #####」,讓每一行它分裂:就拿我當前的代碼通過_得到實際的船舶ID,然後它使用calla「getRate」函數向使用UPS或USPS API的服務器發送ajax呼叫以獲得給定貨物的費率。

這適用於UPS所有行立即開始加載並單獨返回它們的費率。 Stamps.com現在面臨的問題是,他們使用經過驗證的肥皂對話,因此需要從第一次呼叫接收驗證字符串,並在下一次呼叫中使用,等等。

所以基本上我需要修改上面的函數來執行「getRate()」函數並在執行下一次迭代之前等待它完成。

任何人都知道我可以如何做到這一點與大量的大驚小怪?

編輯 - 在這個問題Clearification被問:

我要採取以下功能:

的getRate(shipid);

和訪問它像這樣:

的getRate(shipid,函數(shipList){_Function_data_here_});

當我定義getRate函數時,如何定義它以使其具有回調能力?這是如何運作的?

+0

你上面的每個循環都應該等待getRate在迭代之前完成。你可能想爲Stamps.com做的事情是讓getRate返回可以存儲在一個變量中並在下一次迭代期間發送的驗證字符串 – MrOBrian 2012-07-14 00:10:27

+1

除了所有的東西,你需要看看['。.on()']( http://api.jquery.com/on/)或['$ .delegate()'](http://api.jquery.com/delegate/)(而不是['$ .live()']( http://api.jquery.com/live/),這是不贊同和非常低效的)。 – 2012-07-14 00:11:04

+0

我的系統已經執行了認證程序,但問題是多個正在同時執行。我需要知道如何「等待」或在下一次迭代中回調。我寧願不使用同步阿賈克斯,但我想我會如果我必須。 – SublymeRick 2012-07-14 00:15:40

回答

2

我建議你一次提取所有的ID並將它們傳遞給你的函數。這樣,您可以輕鬆地單獨處理第一個,然後再處理其餘部分。藉助延遲對象,這非常簡單。

例如:

function extractAllIds(callback) { 

    var ids = $('#shiplist tr.mainRow').map(function() { 
     return this.id.split('_')[1]; 
    }).get(); 

    callback(ids); 
} 

function getRates(ids) { 
    var first = ids.shift(); 

    $.ajax({data: first, ...}).done(function(response) { 
     // extract the authenticator string 
     for(var i = ids.length; i--;) { 
      $.ajax({data: ids[i], ...}); 
     } 
    }); 
} 

extractAllIds(getRates); 

以任何方式,你不能讓$.each等待Ajax調用響應。

+0

我會試試這個,或類似的東西。 – SublymeRick 2012-07-14 00:20:45

+0

我想知道['$ .promise()'](http://api.jquery.com/promise/)在這裏有意義嗎? 'deferred.done()'算作'promise'嗎? – 2012-07-14 00:31:07

+0

@Jared:承諾接口是延遲接口的子集,它只允許添加回調但不解決或拒絕回調。我假設(但不知道)'$ .ajax'已經返回一個承諾對象。 – 2012-07-14 00:36:02

相關問題