gpt4 book ai didi

javascript - 堆叠可选 promise 的正确方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:44:34 24 4
gpt4 key购买 nike

使用原生 Node promises 从 DB 收集所有数据的正确或最佳方法是什么?

目标只是呈现所选择的内容:

const allPromises = [];
const selected = {
sectionA: true,
sectionB: false,
sectionCIds: [ 1, 2, 4 ],
};

if (selected.sectionA) {
allPromises.push(getSectionADataFromDbPromise());
}
if (selected.sectionB) {
allPromises.push(getSectionBDataFromDbPromise());
}
if (selected.sectionCIds.length > 0) {
allPromises.push(selected.sectionCIds
.map(getSectionCDataFromDbPromise)
);
}
Promise.all(allPromises)
.then((allResults) => {
if (selected.sectionA) {
dataA = allResults[0];
}
if (selected.sectionA) {
dataB = allResults[1];
}
if (selected.sectionC) {
dataC = allResults[2]; // <-- this will not work if B is not selected
}

// ... same logic to build report: return Promise.all()...
});

可能的解决方案:

  • 跟踪每个选定数据的索引(例如,C 的索引将为 1)
  • 对象图
  • 将 else { allPromises.push(Promise.resolve(null)) } 添加到每个 if

是否有更简单的方法或其中之一是正确的方法?

最佳答案

不要有条件地对数组使用push,而是始终将相同的值放在相同的索引处。即使该值什么都不是 - Promise.all 也会处理得很好。

const selected = {
sectionA: true,
sectionB: false,
sectionCIds: [ 1, 2, 4 ],
};
Promise.all([
selected.sectionA ? getSectionADataFromDbPromise() : null,
selected.sectionB ? getSectionBDataFromDbPromise() : null,
Promise.all(selected.sectionCIds.map(getSectionCDataFromDbPromise))
]).then(([dataA, dataB, dataC]) => {
if (selected.sectionA) {
// use dataA
}
if (selected.sectionA) {
// use dataB
}
if (dataC.length) { // same as selected.selectionCIds.length
// use dataC
}
});

关于javascript - 堆叠可选 promise 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47470147/

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