簡體   English   中英

如何使用promises為對象數組的每個元素進行ajax調用?

[英]How to make an ajax call for each element of an array of objects, using promises?

我有這個代碼:

       // _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通話設置

  • url:sessionURL
  • data:要發送到服務器的數據是對模塊queryServ.js的外部調用以及返回JSON對象的函數getAllUserDomainCommentsFunct。 它需要這些參數:currentDomain,userID,currentDomain(再次),currentURL
  • 類型:文字
  • contentType:text / plain
  • 上下文:這個

****注釋是jsonObject smilar到{id: "998", textOfcomment:"I commented this", target: "//targetID"}.

我想要做的是為數組“_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()的參數做什么(你好像已經$.post()了jQuery doc沒有顯示的一些參數)所以我稍微簡化了一下,但你可能需要調整那些$.post()參數以滿足您的目的。


就個人而言,我鄙視$.when()以及它如何與jQuery ajax promises交互(非常混淆使用)所以我會將ajax承諾轉換為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
});

或者,如果您包含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
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM