如何停止从js函数返回直到所有ajax完成

时间:2013-12-23 07:31:24

标签: javascript jquery ajax

function processData(data) {
    //some processing 
    return data;
}
function test() {
    $.ajax({
        'url': api1,
        'data': {
            'use': "200"
        },
        'dataType': 'json'
    }).done(function (data) {
        $.ajax({
            'url': api2,
            'data': {
                'use': data.ud;
            },
            'dataType': 'json'
        }).done(function (data) {
            processData(data);
        });
    });
return;
}
function main() {
    test.done(function (data) {
        parse(data);
    });
}

我想等到在返回之前在test()中嵌套ajax完成。 aync = false是一种方式,但有些人认为这不是一个好选择。什么可以是它的好方法。

1)一个ajax的结果在其他调用中用作输入,所以当()不能用于执行并行调用时

2)返回将在第二个ajax完成之前执行,并执行其回调。肯定2ned ajax回调将被执行但在返回该测试之前并且从main调用它的完成。

4 个答案:

答案 0 :(得分:0)

您可以使用jQuery.when()

描述:提供一种基于一个或多个对象执行回调函数的方法,通常是表示异步事件的Deferred对象。

答案 1 :(得分:0)

您需要从测试中返回ajax来电并使用已完成的电话。

function test() {
    $.ajax({
        'url': api1,
        'data': {
            'use': "200"
        },
        'dataType': 'json'
    }).done(function (data) {
        return $.ajax({
            'url': api2,
            'data': {
                'use': data.ud;
            },
            'dataType': 'json'
        });
    });
}

function main() {        
    test.done(function (data) {
        processData(data);
        parse(data);
    });
}

答案 2 :(得分:0)

async: false是个坏主意,因为ajax并不意味着阻止。没有async: false,你无法阻止函数返回。更好的解决方案是使用Deferred对象。您可以像这样改进代码。

function processData(data) {
  return data;
}

function test() {
  // what is being returned here is a deferred object
  // see http://api.jquery.com/deferred.then/
  return $.ajax().then(function (data) {
    return $.ajax().then(function (data) {
      return processData(data);
    });
  });
}

function main() {
  // you can't stop test from returning, but you can used the return Deferred object
  test().done(function (finalData) {
    // processData(data) in test will be available as `finalData` here
  });
}

答案 3 :(得分:0)

我建议你试试我创建的这个jQuery插件。 我希望它可以使ajax调用链更容易。 jQuery.chain

$.chain(ajaxfunc,parse, processData).then(success, failure);

你可以找到演示here