2016-10-05 32 views
2

我有这样的代码:如何使用promises为对象数组的每个元素调用ajax?

 // _arrOfUsers = array of objects, each object represents a user. 
     //For example, a single object may be something like {name:"mike", id:"123"}  

      var _successUsers = function (_arrOfUsers) {    
        var promises = []; //empty array of promises 

         _arrOfUsers.forEach(function (user) { 
          promises.push(function() { 
           return $.Deferred(function (dfd) { 
            $.post("//sessionID", 
               queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL"), 
             'text', 'text/plain', this, 
             function (dataX) { 
              dfd.resolve(dataX); 
             }); 
           }).promise(); 
          }); 
        }); 

        $.when(promises).then(function (results) { 
         console.log(results); 
        }); 

       }; 

一些元素来理解这段代码:

**** Ajax调用设置

  • 网址:sessionURL
  • 数据:数据发送给服务器是外部调用模块 queryServ.js和函数getAllUserDomainCommentsFunct 返回一个JSON对象。它需要这些参数的工作: currentDomain,用户ID,currentDomain(再次),CURRENTURL
  • 类型:文本
  • 的contentType:text/plain的
  • 背景:这

****注释是一个jsonObject类似于{id: "998", textOfcomment:"I commented this", target: "//targetID"}.

我想要做的是为数组“_arrOfUsers”的每个用户做一个ajax调用来提取他在服务器上的所有评论;在所有“提取”之后,我需要获得所有结果(即所有用户的所有评论)并将其打印在控制台中。顺序对我的代码很重要,这就是我使用Promise的原因。

我在StackOverflow的JSfiddle上找到了这个算法的结构,但它对我不起作用,因为它返回一个函数数组,我无法理解为什么,可能是因为我从来没有在使用Promise期间我的事业。

先谢谢您,如果有什么不清楚的地方请随时告诉我。

回答

2

由于$.post()已经返回一个承诺,并且$.when()可以让您保持结果,所以没有必要在此创建延迟。相反,你可以这样做:

$.when.apply($, _arrOfUsers.map(function(user) { 
    return $.post("//sessionID", queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL")); 
})).then(function() { 
    // all results available in order here as arguments to this callback 
    // arguments[0][0] is the first result 
    // arguments[1][0] is the second result 
    // arguments[2][0] is the third result and so on 
    for (var i = 0; i < arguments.length; i++) { 
     // arguments[i][0] is next one of your results 
    } 
}); 

注:我不太明白你正在尝试与论据做$.post()(你似乎已经取得了一些争论jQuery的文档不显示)所以我简化了一些,但你可能需要调整这些$.post()的论点,以适应你的目的。


就个人而言,我鄙视$.when()以及它如何使用jQuery阿贾克斯承诺(非常混乱使用)相互作用,所以我会投阿贾克斯承诺的ES6承诺,使用Promise.all()(使用Bluebird对承诺的支持,如果旧的浏览器支持是需要的)。

Promise.all(_arrOfUsers.map(function(user) { 
    return Promise.resolve($.post("//sessionID", queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL"))); 
})).then(function(results) { 
    // results is an array of results in order 
}); 

或者,如果你有蓝鸟,你可以使用:

Promise.map(_arrOfUsers, function(user) { 
    return Promise.resolve($.post("//sessionID", queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL"))); 
}).then(function(results) { 
    // results is an array of results in order 
}); 
+0

谢谢您发表评论jfriend00,我会尽快尝试不可能性的代码。无论如何,我添加了这些参数,因为我试图保留$ .ajax(url [,settings])的所有参数..但无论如何我不确定它是否正确! – nicoperillo

+0

@nicoperillo - 如果您要将所有参数传递给'$ .post()',您必须将它们放入一个对象中并传递该对象。 – jfriend00

+0

你的代码很好用!非常感谢你! – nicoperillo

相关问题