如何动态堆叠承诺?
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承诺并将其添加到堆栈中。
我有一个嵌套对象 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承诺并将其添加到堆栈中。