我有以下代码:
// _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:文本/纯文本
>上下文:此
****注释是{{id:“ 998”,textOfcomment:“我对此进行了注释”,target:“ // targetID”}的jsonObject的缩写.
我想要做的是对数组“ _arrOfUsers”的每个用户进行ajax调用,以提取其在服务器上的所有注释;毕竟,“提取”之后,我需要获取所有结果(即来自所有用户的所有注释)并将其打印在控制台中.顺序对我的代码很重要,这就是为什么我使用Promises的原因.
我在*上的JSfiddle上找到了该算法的结构,但是它对我不起作用,因为它返回了一组函数,而且我不明白为什么,可能是因为我在职业生涯中从未使用过Promises.
预先谢谢您,如果有不清楚的地方,请随时告诉我.
解决方法:
由于$.post()已经返回了一个Promise,而$.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 ajax promises交互(非常令人困惑使用),因此我将ajax promise转换为ES6 promise并使用Promise.all()(如果使用较旧的浏览器,请使用Bluebird作为promise支持)需要支持).
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
});
或者,如果您包括Bluebird,则可以使用:
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
});