gpt4 book ai didi

javascript - 我如何等待多个 Promise.all()

转载 作者:行者123 更新时间:2023-12-01 22:53:57 26 4
gpt4 key购买 nike

我正在使用一些旧代码,并尝试返回两个 promise 数组的结果。

所以基本上 body 包含 firstsecond,它们是 id 数组。我知道下面的代码适用于 1 到 5 个 id 的小数组,但如果我要执行几百个,在我从两个 promise 数组获得数百个结果之前解析会触发吗?

 const doSomething = (body) => {
return new Promise((resolve, reject) => {
const promisesOne = body.first.map((id) =>
doSomethingOne(id)
);

const promisesTwo = body.second.map((id) =>
doSomethingTwo(id)
);

let response = {
first: {}
second: {}
headers: 'mock headers'
};

Promise.all(promisesOne).then((results) => {
response.first = results;
});

Promise.all(promisesTwo).then((results) => {
response.second = results;
});

resolve(response);
});
};

此外,我无法将其重构为 async/await,因为此代码库未使用它。

最佳答案

would the resolve fire before I get the ... results from both promise arrays?

是的,绝对是因为您不是在等待他们解决。

只需将两个 Promise.all() promise 包装在另一个 Promise.all() 中以等待一切,然后创建您想要的最终对象。

const doSomething = (body) => {
return Promise.all([
Promise.all(body.first.map(doSomethingOne)),
Promise.all(body.second.map(doSomethingTwo)),
]).then(([first, second]) => ({
first,
second,
headers: "mock headers",
}));
};

您可以通过创建一个 body 属性名称到它们对应的映射函数的映射来使它通用。例如

const mappers = {
first: doSomethingOne,
second: doSomethingTwo,
};

const doSomething = (body) => {
return Promise.all(
Object.entries(mappers).map(([key, mapper]) =>
Promise.all(body[key].map(mapper)).then((data) => ({ [key]: data }))
)
)
.then((results) => Object.assign({ headers: "mock headers" }, ...results));
};

关于javascript - 我如何等待多个 Promise.all(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73684061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com