2013-04-29 88 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

相关问题