jQuery承诺和依赖的AJAX调用

时间:2014-03-08 18:56:49

标签: javascript jquery ajax promise jquery-deferred

我想知道如何使用jQuery中的promises / deferred进行依赖的AJAX调用。现在我有这样的事情:

$.when($.ajax('https://somedomain.com/getuserinfo/results.jsonp', {
  dataType      : 'jsonp',
  jsonp         : true,
  jsonpCallback : 'userCallback'
}))
.then(function (data) {
  return $.when($.getJSON('http://www.otherdomain.com/user/' + data.userId), $.getJSON('http://www.anotherdomain/user').then(function (json1, json2) {
    return {
      json1  : json1,
      json2  : json2
    };
  });
});

它按预期为我工作,但我不知道这是否是一种正确的方法。您对如何改进有任何建议吗?

1 个答案:

答案 0 :(得分:1)

嗯,您的代码似乎已经“正确”,但有一些方面需要改进:

$.when($.ajax(…))

此处您不需要$.when$.ajax已经确实返回了承诺。

$.when($.getJSON(…), $.getJSON(…).then(…)

你在这里错过了一个右括号 - 可能在.then之前。假设:

….then(function(…){ return ….then(function(…){…}); })

由于承诺是monadic,你可以unnest回调

…
.then(function(…){ return …; })
.then(function(…){…})

避免厄运的金字塔。


特定jQuery的:

$.when(…).then(function (json1, json2) {
  return {
    json1: json1,
    json2: json2
  };
});

$.when之后回调的参数不是简单的结果,而是每个getJSON延迟解决方案的arguments objects。您可能只需要JSON,它位于第一个索引上:

$.when(…).then(function (json1, json2) {
  return {
    json1: json1[0],
    json2: json2[0]
  };
});