订单数组ajax调用,javascript-如何使用promise对对象数组的每个元素进行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:文本/纯文本

>上下文:此

****注释是{{id:“ 998”,textOfcomment:“我对此进行了注释”,target:“ // targetID”}的jsonObject的缩写.

我想要做的是对数组“ _arrOfUsers”的每个用户进行ajax调用,以提取其在服务器上的所有注释;毕竟,“提取”之后,我需要获取所有结果(即来自所有用户的所有注释)并将其打印在控制台中.顺序对我的代码很重要,这就是为什么我使用Promises的原因.

我在StackOverflow上的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

});

标签:iterable,ajax,promise,javascript

来源: https://codeday.me/bug/20191118/2025570.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值