【问题标题】:How to stack promises dynamically?如何动态堆叠承诺?
【发布时间】:2022-02-10 04:09:33
【问题描述】:

我有一个嵌套对象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);

但是,subproject 上的属性在调用 fillForm 时没有定义

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);
  });
};

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

【问题讨论】:

  • 恐怕不清楚您要做什么。 Promise.all() 接受 Promises,而不是函数,但是如果您调用 fetchAvailableRates 并用 Promises 填充堆栈,那么 Promise.all() 将工作并返回一组费率(尽管您没有向我们展示任何代码可以将这些返回的费率放回原处进入子项目)。您能帮助我们理解为什么“不调用它”很重要以及您希望发生什么吗?
  • @JeffBowman 你帮我找到了它,我的fetchAvailableRates() 没有兑现承诺
  • 哦,我明白了。我会回答,但你也可以自己回答。

标签: javascript asynchronous async-await promise


【解决方案1】:

您对fetchAvailableRates 的定义使用了this,但是当您引用一个对象的函数而不调用它时(如stack.push(ue.fetchAvailableRates)),它失去了对this 的引用,而只是变成了一个函数。

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

这不是您需要进行的唯一更改——Promise.all() 不接受函数,只接受承诺,因此正确的调用可能是让 ue.fetchAvailableRates() 返回 Promise 并将其添加到堆栈中。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2016-05-16
    • 2018-08-06
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多