2015-10-08 157 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