Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery承诺和依赖的AJAX调用_Javascript_Jquery_Ajax_Promise_Jquery Deferred - Fatal编程技术网

Javascript jQuery承诺和依赖的AJAX调用

Javascript jQuery承诺和依赖的AJAX调用,javascript,jquery,ajax,promise,jquery-deferred,Javascript,Jquery,Ajax,Promise,Jquery Deferred,我想知道如何使用jQuery中的承诺/延迟来进行依赖的AJAX调用。现在我有这样的事情: $.when($.ajax('https://somedomain.com/getuserinfo/results.jsonp', { dataType : 'jsonp', jsonp : true, jsonpCallback : 'userCallback' })) .then(function (data) { return $.when($.getJSON

我想知道如何使用jQuery中的承诺/延迟来进行依赖的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
    };
  });
});

这对我来说就像预期的那样,但我不知道这是否是一种正确的方法。您对如何改进这一点有什么建议吗?

好吧,您的代码似乎已经“正确”了,不过还有一些地方需要改进:

您不需要
$。当这里出现
$时,
$。ajax
已经返回了承诺

此处缺少一个右括号-可能在
之前。然后是
。假设:

由于承诺是一元的,您可以将这些回调

…
.then(function(…){ return …; })
.then(function(…){…})
避免厄运金字塔


特定于jQuery的:

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

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

您应该将此移到代码审阅。好吧,我的问题是,这是否是做这些事情的正确方式?你还没有解释为什么你想要实现,所以我们不能为你想做的事情提供更好的方式。您可以使用
$.ajax(…)。然后(…)
插入
$。当($.ajax(…)。然后(…)
,但现在就这些了。谢谢。但这不是我问题的答案。我的问题是如何进行相关的AJAX调用。我的意思是,我从第一个源(单位为$.when)获取用户详细信息,根据我从中获取的数据,我同时向两个不同的源进行两个AJAX调用,并将第一个源的用户详细信息作为参数发送给另一个AJAX调用。这就是我在第一句话中回答的:就像你做的那样!谢谢,我只是觉得它在某些方面可能是不正确的。
….then(function(…){ return ….then(function(…){…}); })
…
.then(function(…){ return …; })
.then(function(…){…})
$.when(…).then(function (json1, json2) {
  return {
    json1: json1,
    json2: json2
  };
});
$.when(…).then(function (json1, json2) {
  return {
    json1: json1[0],
    json2: json2[0]
  };
});