使用多个延迟的ajax调用时获取正确的数据

时间:2015-01-26 17:02:18

标签: javascript jquery ajax

我有一个使用两个ajax调用的函数,以获取正确的信息:

var getUsers = function() {
  return $.getJSON("http://codepen.io/chriscoyier/pen/EAIJj.js", function(foo) {
    return $.getJSON("http://codepen.io/chriscoyier/pen/EAIJj.js", function(bar) {
      return foo['age'] = bar.type;
    });
  });
}

一个调用当前函数的外部函数,只有在调用完成后才会继续。

getUsers().then(function(result) {
  // ...
});

现在奇怪的是,如果我显示结果,那么' age'将显示在控制台中,但如果我尝试使用result['age']访问它,它将返回undefined。

是否有正确的方法来处理多个延期通话?

代码

http://codepen.io/norbiu/pen/bNRQxL

1 个答案:

答案 0 :(得分:2)

修改您可以将getJSON()返回的内容链接起来,而不是使用单独的延迟

var getUsers = function() {
  var foo;
  return $.getJSON("http://codepen.io/chriscoyier/pen/EAIJj.js")
  .then(function(data) {
      foo = data;
      return $.getJSON("http://codepen.io/chriscoyier/pen/EAIJj.js")
  }).then(function(bar) {
      foo['age'] = bar.type;
      return foo;
  });
}

注意:您需要保存第一次通话时的返回值,否则第二次通话无法访问。

后代的原始代码

您可以使用jQuery Deferred对象并返回

var getUsers = function() {
  var dfd = $.Deferred();
  $.getJSON("http://codepen.io/chriscoyier/pen/EAIJj.js")
  .done(function(foo) {
    $.getJSON("http://codepen.io/chriscoyier/pen/EAIJj.js")
    .done(function(bar) {
      foo['age'] = bar.type;
      dfd.resolve(foo);
    }).fail(function(e) {
       dfd.reject(e);
    })
  }).fail(function(e) {
      dfd.reject(e);
  });
  return dfd.promise();
}

http://codepen.io/anon/pen/pvwqZo

延迟对象不会解决,直到两个请求都成功(如果任何一个请求失败,将会失败)。