【问题标题】:JS Promises resolve in order? [duplicate]JS Promises 按顺序解决? [复制]
【发布时间】:2021-01-18 12:02:00
【问题描述】:

我有一个 promises 数组:

let promises = [];
let teamsLooped = 0;
topTeams.teams.forEach(function(value){promises.push({id: value.teamId})});

我将该 promise 数组传递给这样的 API 函数,我需要在解析期间恢复 teamId,以便在保存文件时将输出分配给正确的团队:

Promise.all(promises.map(o => API.someFunction(o))).then((res) => {
let teamId = promises[teamsLooped].id;
teamsLooped++;
// Rest of the code
...
fs.writeFile("team "+ teamId +".json", JSON.stringify(statsExport), function(err) {
           console.log("Graba team: ", teamId)
            if (err) {
                console.log(err);
            }
        })
}

所以现在我假设 .then() 方法将按照 promises 数组的顺序处理 API 输出。

我的问题是:假设由于所有承诺都已解决,代码将按照它们被传递的相同顺序(即承诺数组的顺序)循环遍历它们是否合理,或者是 .then() 代码按其他顺序处理?

【问题讨论】:

标签: javascript node.js promise


【解决方案1】:

根据您显示的代码,您所要求的内容有点令人困惑。我将尝试解释我认为您可能会问什么。

假设您有一组代码创建 10 个承诺,每个承诺在随机时间内解决,并且它们会跟踪它们的启动时间和完成时间。然后,您可以看到结果并看到数组的顺序与原始数组的顺序相同,即使它们以完全不同的顺序完成:

let finishCntr = 0;

function randDelay(val) {
    let t = Math.floor(Math.random() * 3000);
    return new Promise(resolve => {
        setTimeout(() => {
            let finishSequence = finishCntr++;
            resolve({ launchSequence: val, finishSequence, t });
        }, t);
    });
}

let values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

// create array of promises from the values array
let promises = values.map(launchSequence=> {
    return randDelay(launchSequence);
});

// wait for all the promises to finish
Promise.all(promises).then(results => {
    // log the final results
    console.log(results);
}).catch(e => {
    console.log(e);
});

当你运行这个时,你会看到结果数组的顺序是launchSequence,这是原始值数组的顺序。

所以现在我假设 .then() 方法将按照 promises 数组的顺序处理 API 输出。

Promise.all() 从 promise 数组中收集所有已解决的结果,将这些结果保持在原始 promise 数组中的顺序,然后在所有 promise 完成时调用 .then().catch() 处理程序,或者当一个承诺被拒绝时。

我的问题是:假设由于所有承诺都已解决,代码将按照它们传递的相同顺序(即承诺数组的顺序)循环遍历它们,或者是 .then() 代码是否合理以其他顺序处理?

您的代码根本不会遍历承诺结果,因此您所要求的与您显示的代码相关的内容有点令人困惑。解析的结果数组将在.then() 处理程序的res 参数中。如果您确实有遍历该数组的代码,那么这些结果将按照原始承诺的顺序排列,无论它们以什么顺序完成。


其他评论:

您的数组名为promises 非常具有误导性。它不是一系列的承诺。这是一个对象数组,你在这里创建:

topTeams.teams.forEach(function(value){promises.push({id: value.teamId})});

顺便说一句,可以这样做:

const arrayOfObjects = topTeams.teams.map(value => return {id: value.teamId});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多