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的原因.

我在*上的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
});
上一篇:python(迭代)第十一节


下一篇:python-os.walk().next()中类“ Iterable”的未解析属性引用“ next”