【问题标题】:Continue loop after a function has finished executing. How to use jquery deffered函数执行完毕后继续循环。如何使用jquery deferred
【发布时间】:2013-04-23 00:58:55
【问题描述】:

我有以下数据

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
     })
}

$.each(数据,函数(k,v){ 进程(v.user); })

$.each 将尝试循环,即使 processanotherFunction 尚未完成

问题,我能做些什么来确保所有函数都执行完毕,然后再转到另一个索引?

听说我可以使用 jquery deferred。

【问题讨论】:

  • 那么您的实际问题是什么?
  • 好的。我会把事情弄清楚。出去。我的问题是如何在所有进程执行完毕后继续循环..
  • @JoeySalacHipolito 目前还不清楚你想要什么。您希望process() 在所有操作完成后返回而不是立即返回吗?
  • 我会更新问题。,所有。
  • 我更新了我的问题。

标签: javascript jquery loops each jquery-deferred


【解决方案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));
}

然后等待所有的promise被解决:

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

注意:在一般中,AJAX 调用为错误生成非2xx 返回码而不是“成功”HTTP 调用中的错误码是一种很好的做法。然后,这允许客户端代码使用正常的 AJAX 错误处理(即.fail 回调),而不是在 AJAX 成功处理中检查“错误”。

【讨论】:

  • Alnitak 所说的原则上是正确的,但在这个问题中(如最初给出的那样),有各种链式/递归 ajax 正在进行,因此需要构造 process() 以返回一个承诺最终结果,由相当棘手的.then() 链产生。现在没时间写了....
  • Alnitak,好电话,但如果要解决最初措辞(未简化)问题中的代码,事情会变得有点混乱。
  • 我可以用这个吗? $.get('http://domain.com/hey.tpl').then(function(result){ // do stuffs. });
  • @JoeySalacHipolito 是的,这是合法的。不过,您应该始终尝试return $.get 的结果。
猜你喜欢
  • 2011-11-11
  • 2014-03-22
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多