2015-10-08 194 views
0

我正在進行ajax調用來獲取結果數組。從這個數組中,我正在進行一系列Ajax調用,並試圖對結果進行一些處理。當我返回Promise.all()並繼續執行.then(function(moreData){})時,moreData處於掛起狀態。我錯過了什麼?我沒想到該函數在每個doSomethingElse函數解決之前都會運行。與承諾數組鏈接

doSomething() 
    .then(function(data){ 
     data = data.d.results; 

     return Promise.all(data.map(function(group){ 
      return doSomethingElse(group.Id); 
     }));     
    }) 
    .then(function(moreData){ 
      //moreData is in pending state 
    }) 
    .then(null, function(err){ 
     alert(err); 
    });   

doSomethingdoSomethingElse函數返回一個Deferred對象。

function doSomething(){ 
    var dfd = $.ajax({...}) 
    return dfd; 
} 
function doSomethingElse(id){ 
    var dfd = $.ajax({...}) 
    return dfd; 
} 
+0

是'moreData'一個數組? – Amit

+0

是的,我預料會是。我得到了'Promise {[[PromiseStatus]]:「pending」,[[PromiseValue]]:undefined}'。 – MickB

+1

什麼版本的jQuery?我認爲這將是jQuery承諾實現和任何'Promise'之間的衝突。 –

回答

0

因爲你的諾言(S)是基於jQuery,使用jQuery的版本all.when(),但是這需要一些額外的代碼:

doSomething() 
.then(function(data){ 
    data = data.d.results; 

    var results = new Array(data.length); // Array to hold the results of doSomethingElse 
    return $.when.apply($, data.map(function(group, i){ 
     // Attach a done handler to async operation, put result in results array and return 
     return doSomethingElse(group.Id).done(function(x) { results[i] = x; }); 
    }).unshift($.Deferred().resolve(results)); /* unshift a resolved deferred so that 
                moreData recieve results */ 
}) 
.then(function(moreData){ 
    // moreData is now and array with the resolved results of doSomethingElse() 
}) 
.then(null, function(err){ 
    alert(err); 
}); 
+1

小心,'$ .when'期望Deferreds作爲參數,而不是一個Deferreds數組。傳遞一個數組會導致它立即用該數組作爲值來解析。你會想'$ .when.apply($,...)'。 – Shai

+0

好點@Shai。想要做的榮譽? – Amit

+0

我試圖不使用.apply(),因爲然後與動態數組我必須使用arguments []關鍵字。我已經使用了'Promise.all()',但只有當我不鏈接它時纔會成功。 – MickB