ffx*_*292 3 javascript promise es6-promise
我正在使用一些旧代码,并尝试返回两个承诺数组的结果。
所以基本上主体包含first和second是 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);
});
};
Run Code Online (Sandbox Code Playgroud)
另外,我无法将其重构为 async/await,因为此代码库不使用它。
在我从两个 Promise 数组中得到 ... 结果之前,解析会触发吗?
是的,绝对是因为您没有等待他们解决。
只需将两个Promise.all()承诺包装在另一个承诺中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",
}));
};
Run Code Online (Sandbox Code Playgroud)
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));
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1201 次 |
| 最近记录: |