堆叠选择承诺的正确方法

Vla*_*nac 5 javascript node.js promise es6-promise

使用promises从DB收集所有数据的正确或最佳方法是什么,但使用本机Node承诺.

目标只是呈现所选内容:

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()...
  });
Run Code Online (Sandbox Code Playgroud)

可能的解决方案:

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

是否可能更容易,或者其中一个是正确的方法?

Ber*_*rgi 2

不要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
  }
});
Run Code Online (Sandbox Code Playgroud)