如何动态堆叠承诺?

How to stack promises dynamically?

我有一个嵌套对象 subprojects,其中 属性 类型为数组:userEstimates 包含对象 Estimate.

我希望遍历 userEstimates 并将 fetch/promise 推送到数组而不调用它。

main(在 async 函数内)

await subproject.getUserEstimates(true);
let stack = [];

subproject.userEstimates.forEach(ue =>
    stack.push(ue.fetchAvailableRates)
);

console.log(stack);  // 3) [ƒ, ƒ, ƒ]

await Promise.all(stack);

fillForm(subproject);

但是,调用 fillForm

时未定义 subproject 上的属性

fetchAvailableRates 的函数定义:

fetchAvailableRates = () => {
  this.availableRates = fetch(...)
  .then((resp) => {
    if (resp.ok) return resp.json();
    else throw new Error("Something went wrong");
  })
  .then((r) => {
    ...

    return {
      Rate.get(), // returns class
      ...
    };
  })
  .catch((e) => {
    console.error(e);
  });
};

编辑:将我的措辞从队列更改为堆栈,因为我试图一次运行所有请求,而且我不关心顺序

您对 fetchAvailableRates 的定义使用 this,但是当您引用对象的函数而不调用它时(如 stack.push(ue.fetchAvailableRates)),它会丢失对 this 的引用并简单地成为一个函数。

要引用当时在 ue 实例上调用 ue.fetchAvailableRates 的函数,您应该调用 () => ue.fetchAvailableRates()ue.fetchAvailableRates.bind(ue).

这不是您需要做的唯一改变——Promise.all() 不接受函数,只接受 promises,所以正确的调用可能是 ue.fetchAvailableRates() return承诺并将其添加到堆栈中。