Javascript 如何处理$.Deferred中的嵌套调用

Javascript 如何处理$.Deferred中的嵌套调用,javascript,jquery,Javascript,Jquery,我使用jQuery的$.Deferred函数处理多个嵌套调用。目前代码工作不正常。我想在所有请求完成后启动一个函数。但目前在两次请求之后,它会到达控制台.log 函数ajac(){ var dfd=$.Deferred(); var api=要求(‘模块/api’); 对于(var i=0;i单个承诺只能解决或拒绝一次。您需要返回不同的承诺才能解决所有承诺。类似如下: function ajac(){ var allPromises = []; var api = require('m

我使用jQuery的
$.Deferred
函数处理多个嵌套调用。目前代码工作不正常。我想在所有请求完成后启动一个函数。但目前在两次请求之后,它会到达
控制台.log

函数ajac(){
var dfd=$.Deferred();
var api=要求(‘模块/api’);

对于(var i=0;i单个承诺只能解决或拒绝一次。您需要返回不同的承诺才能解决所有承诺。类似如下:

function ajac(){
  var allPromises = [];
  var api = require('modules/api');
  for(let i=0;i<2;i++){
      let dfd = $.Deferred();
      api.request("GET","https://t25501-s39032.sandbox.mozu.com/events/priceadjustment").then(function(res) {
          api.request("GET","https://t25501-s39032.sandbox.mozu.com/events/priceadjustment").then(function(res) {
            dfd.resolve();
          });
      });
      allPromises.push(dfd.promise());
  }
  return Promise.all(allPromises);
}
$.when(ajac()).then(function(){
  console.log("reached");
})
函数ajac(){
var-allPromises=[];
var api=要求(‘模块/api’);

对于(设i=0;i您遇到的问题是,即使循环表明您打算跟踪多个延迟,您最终还是要定义、解决和返回一个延迟。当
期望多个延迟作为单个参数传递时,为了使示例起作用,我将模拟
作为从jQuery文档中提取的yncEvent
函数。请参阅下面的代码片段,以查看所有功能是否按预期工作:

函数asyncEvent(){
var dfd=jQuery.Deferred();
//在随机间隔后解析
setTimeout(函数(){
dfd.决议(“万岁”);
},Math.floor(400+Math.random()*2000));
//退回承诺,这样打电话的人就不能更改延期付款
返回dfd.promise();
}
函数makeAjac(i){
var dfd=$.Deferred()
asyncEvent().then(函数(res){
asyncEvent().then(函数(res){
log(`request pair${i}complete.`);
解析();
});
});
返回dfd.promise();
}
函数ajac(){
var promisesArray=[];
对于(var i=0;i您可以尝试以下方法:

您需要浏览此链接:

var callAPI=function(){
持续承诺=新承诺((解决、拒绝)=>{
var api=要求(‘模块/api’);
解析(api.request(“GET”https://t25501-s39032.sandbox.mozu.com/events/priceadjustment"));
});
回报承诺;
}    
函数getInfo(){
持续承诺=新承诺((解决、拒绝)=>{
var-allPromise=[];
对于(var i=0;i{
控制台日志(“到达”,结果);
});

不幸的是,我不相信上面的代码片段会起作用。因为循环中的两个迭代(
dfd
)都使用了一个延迟,所以
allPromises
数组中的两个承诺永远不会达到“已解决”的声明并因此得到
承诺。所有的
都无法解决。我可能是错的,但我尝试将其拉到一个带有一些修改过的模拟异步函数的代码段中,结果似乎就是这样。@AlexanderNied感谢您指出这一点。这是使用
var
的范围问题。我已经更新了我的答案,使用初始化
dfd
ode>let
let prom+i=$.Deferred();
这是无效的语法-JS变量名不能以这种方式动态更改/生成,除非使用一些全局名称空间hack(即将它们定义为
窗口
对象上的属性).Hi@AlexanderNiedEditedHi Shubham——不幸的是,这段代码仍然存在一些问题。我看到的主要问题是,您正在返回
承诺。所有
都是在您第一次执行循环时返回的,因此它永远不会重复。Ohhh;)@AlexanderNied,这是错的。Thanks@DavidBray-这当然可能是真的——我只是想回答用户关于jQuery延迟对象的特定问题。鉴于频繁使用
var
,这是一个jQuery特定的问题,OP可能处于需要支持旧浏览器的场景中浏览器。
var callAPI=function(){
const promise = new Promise((resolve, reject) => {
         var api = require('modules/api');
         resolve(api.request("GET","https://t25501-s39032.sandbox.mozu.com/events/priceadjustment"));
  });
return promise;
}    


function getInfo(){
    const promise = new Promise((resolve, reject) => {
            var allPromise=[];
            for(var i=0;i<2;i++){
                  allPromises.push(callAPI());
            }
                  return Promise.all(allPromises);
     });
return promise;
}

getInfo().then((result)=>{
       console.log("reached",result);
});