Javascript 与承诺数组链接
我正在进行一个ajax调用以获得一系列结果。从这个数组中,我进行了一系列ajax调用,并尝试对结果做一些处理。当我返回Promise.all并继续.thenfunctionmoreData{}时,moreData处于挂起状态。我错过了什么?我不希望函数在每个doSomethingElse函数解析之前运行Javascript 与承诺数组链接,javascript,jquery,arrays,ajax,Javascript,Jquery,Arrays,Ajax,我正在进行一个ajax调用以获得一系列结果。从这个数组中,我进行了一系列ajax调用,并尝试对结果做一些处理。当我返回Promise.all并继续.thenfunctionmoreData{}时,moreData处于挂起状态。我错过了什么?我不希望函数在每个doSomethingElse函数解析之前运行 doSomething() .then(function(data){ data = data.d.results; return Promise.al
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);
});
doSomething和doSomethingElse函数返回延迟对象
function doSomething(){
var dfd = $.ajax({...})
return dfd;
}
function doSomethingElse(id){
var dfd = $.ajax({...})
return dfd;
}
由于您的承诺基于jQuery,请使用jQuery版本的all,但这需要一些额外的代码:
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);
});
moreData是数组吗?是的,我希望是数组。我得到了承诺{[[PromiseStatus]]:待定,[[PromiseValue]]:未定义}。什么版本的jQuery?我认为这将是jQuery承诺实现和任何承诺之间的冲突。jQuery verions是1.11.3谨慎,$。当期望延迟作为参数,而不是延迟数组时。向其传递一个数组会使其立即解析为该数组作为值。您将需要$.when.apply$,..我试图不使用.apply,因为对于动态数组,我必须使用arguments[]关键字。我用过Promise.all,但只有当我不把它拴起来的时候我才会成功。@MickB,我不懂。使用apply只是将映射的数组转换为$。当jQuery使用它所期望的格式时。我已经对Amit的答案进行了编辑,所以你可以理解我的意思。其他一切都是一样的,您必须在哪里使用参数?当我使用apply并尝试访问中的结果数组时。然后,moreData只包含第一个参数参数[0],而不包含整个结果数组。@MickB啊,我明白了。是的,这就是jQuery延迟的工作方式。一个可能更好的选择是在早期阶段将jQuery转换为符合规范的,例如ES6承诺。您可以通过在doSomething/doSomethingElse中包装任何jQuery延迟,例如$.ajax调用的结果,例如:properPromise=Promise.resolvemyjQueryDfd。这样做的结果将是一个承诺/a+符合承诺,然后您可以在问题的代码中使用它,包括Promise.all调用,完全按照原样。