Javascript 使用递归函数按顺序执行多个ajax请求,并在所有请求完成后执行回调函数

Javascript 使用递归函数按顺序执行多个ajax请求,并在所有请求完成后执行回调函数,javascript,ajax,recursion,Javascript,Ajax,Recursion,我有用逗号分隔的名字列表。我想要的是,我想要为序列中的所有名称调用服务器请求,并将结果存储在数组中。我试过了,当我确实有很多名字在字符串中时,它就起作用了 看到了吗?当我知道名字的数量时,这就起作用了 现在我想要的是,我想让这段代码成为通用代码。如果我在该字符串中添加一个名称,它将自动处理,而无需为ajax请求添加任何代码 看,这就是我试过的。它没有按预期工作 shoppingList = shoppingList.split(","); var result = []; function f

我有用逗号分隔的名字列表。我想要的是,我想要为序列中的所有名称调用服务器请求,并将结果存储在数组中。我试过了,当我确实有很多名字在字符串中时,它就起作用了

看到了吗?当我知道名字的数量时,这就起作用了

现在我想要的是,我想让这段代码成为通用代码。如果我在该字符串中添加一个名称,它将自动处理,而无需为ajax请求添加任何代码

看,这就是我试过的。它没有按预期工作

shoppingList = shoppingList.split(",");
var result = [];

function fetchData(shoppingItem)
{
    var s1 = $.ajax('/items/'+shoppingItem);
    s1.then(function(res) {
        result.push(new Item(res.label,res.price));
        console.log("works fine");
    });
    if(shoppingList.length == 0)
    {
        completeCallback(result);
    }
    else
    {
        fetchData(shoppingList.splice(0,1)[0]);
    }
}

fetchData(shoppingList.splice(0,1)[0]);
问题


我不知道如何检测所有promise对象都已解析,以便调用回调函数。

要按顺序发出ajax请求,必须将递归调用放入回调中:

// global:
var pendingRequests = 0;

// after each ajax request:
pendingRequests++;

// inside the callback:
if (--pendingRequest == 0) {
    // all requests have completed
}
function fetchList(shoppingList, completeCallback) {
    var result = [];
    function fetchData() {
        if (shoppingList.length == 0) {
            completeCallback(result);
        } else {
            $.ajax('/items/'+shoppingList.shift()).then(function(res) {
                result.push(new Item(res.label,res.price));
                console.log("works fine");
                fetchData();
//              ^^^^^^^^^^^
            });
        }
    }
    fetchData();
}
或者你真的用承诺去做

function fetchList(shoppingList) {
    return shoppingList.reduce(function(resultPromise, shoppingItem) {
        return resultPromise.then(function(result) {
            return $.ajax('/items/'+shoppingItem).then(function(res) {
                result.push(new Item(res.label,res.price));
                return result;
            });
        });
    }, $.when([]));
}
()


注意,任务的要求中没有关于按顺序发出ajax请求的内容。您还可以让它们并行运行,并:


()

我已将您的代码修改到最低限度以使其正常工作-


请注意,您的最后一个断言将失败,因为项目承诺不是以线性方式解决的。因此,项目的顺序将发生变化。

这与我检查数组长度时所做的相同。我认为这没用。你能更新一下我的小提琴并告诉我它是如何工作的吗?它看起来是正确的,但我发现它很难理解。你能更新我的小提琴代码让我明白吗。我想使用第二种方法。注意,在第一种解决方案中,它应该是
function fetchList(shoppingList) {
    $.when.apply($, shoppingList.map(function(shoppingItem) {
        return $.ajax('/items/'+shoppingItem).then(function(res) {
            return new Item(res.label,res.price);
        });
    })).then(function() {
        return Array.prototype.slice.call(arguments);
    })
}