Javascript 与承诺数组链接

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

我正在进行一个ajax调用以获得一系列结果。从这个数组中,我进行了一系列ajax调用,并尝试对结果做一些处理。当我返回Promise.all并继续.thenfunctionmoreData{}时,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);
    });         
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调用,完全按照原样。