2013-04-29 39 views
0

,我有以下數據函數完成執行後繼續循環。對於如何使用jQuery遞延

var data = [{user:"somename"}, {user:"anothername"}]; 

我有這個功能是處理該說,我們說,檢查用戶是否存在

function process(user) { 
    $.ajax({ 
     url: 'http://domain.com/api', 
     success: function(result) { 
      if(result == 'success') 
       anotherFunction(); 
      else 
       console.log('error'); 
     } 
    }) 
} 

function anotherFunction() { 
    $.ajax({ 

     // do stuffs 
    }) 
} 

$。每次(數據,功能( K,v){ 處理(v.user); })

$.each的將嘗試環路連processanotherFunction沒有finishe d yet

問題,我能做些什麼來確保所有功能在執行到另一個索引之前完成執行?

我聽說我可以使用jQuery推遲。

+0

那麼你真正的問題是什麼? – Alnitak 2013-04-29 11:19:45

+0

好的。我會清除一些事情。出。我的問題是如何在所有進程完成執行後繼續循環。 – 2013-04-29 11:21:12

+0

@JoeySalacHipolito目前還不清楚你想要什麼。你希望'process()'在一切完成而不是一次完成後返回嗎? – zeroflagL 2013-04-29 11:26:00

回答

1

收集你的AJAX函數返回的承諾,如果有.then導致必要的後處理,使其調用anotherFunction()後者也必須return$.ajax結果。

function process() { 
    return $.ajax(...).then(function(result) { 
     if (result === 'success') { 
      return anotherFunction(); 
     } else { 
      return null; // this might need to change... 
     } 
    }); 
} 

function anotherFunction() { 
    return $.ajax(...); 
} 

var promises = []; 
$.each(data, function(k, v) { 
    promises.push(process(v.data)); 
} 

,然後等待所有承諾得到解決:

$.when.apply($, promises).done(function() { 
     // all done here 
}); 

注:在一般這是很好的做法AJAX調用產生的錯誤非2xx返回代碼,而不是「成功」HTTP調用中的錯誤代碼。然後,這允許客戶端代碼使用正常的AJAX錯誤處理(即.fail回調),而不是檢查AJAX成功處理中的「錯誤」。

+0

我會試試這個。 – 2013-04-29 11:30:07

+0

我更新了我的問題。 – 2013-04-29 11:51:28

+0

原則上,Alnitak說的是正確的,但在這個問題中(如最初給出的),有各種各樣的鏈接/遞歸ajax正在進行,因此'process()'需要被構造來返回最終結果的承諾*,由一個相當棘手的'.then()'鏈產生。沒有時間現在寫它.... – 2013-04-29 11:59:34

相關問題