2016-10-05 30 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

相關問題