【发布时间】:2021-09-12 07:50:00
【问题描述】:
我正在寻找一种 whenever 类型的承诺助手。让我们使用Promise.All 函数。
我有4个承诺。二是瞬间速度。一是快。一是慢。缓慢的承诺需要 3 秒才能解决。
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 3000, 'slow');
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
// here I want to setState()
// this.setState({values})
});
// output: Array [3, "slow", "foo"]
当我运行代码时,all 将等待所有承诺(所以 3 秒)然后显示数组。这遵循文档:
Promise.all() 方法将一个可迭代的 Promise 作为输入,并返回一个 Promise,该 Promise 解析为输入 Promise 的结果数组。 当所有输入的 Promise 都已解决时,此返回的 Promise 将解决,或者如果输入的可迭代对象不包含任何 Promise。它会在任何输入的 Promise 被拒绝或 non-Promise 抛出错误时立即拒绝,并会以第一个拒绝消息/错误来拒绝。
强调是我的
现在我正在寻找一种方法,该方法将返回一个承诺,然后在输入的承诺之一已解决时解决。
类似:
Promise.whenever([promise1, promise2, promise3]).then((value) => {
console.log(value);
// here I want to setState()
// this.setState({values: this.state.values.concat([value])})
});
谁来打印
3
foo
slow
【问题讨论】:
-
所以最后,您实际上并不关心聚合结果,您只需要在它们履行时处理这些承诺。在这种情况下,您编写的助手可能就是要走的路。
-
您希望
here I want to setState()被多次调用吗?即在您的示例中最多 3 次,每个已解决的承诺一次? -
@raina77ow 基本上我正在获取一堆资源,我想尽可能显示它们。
-
@JaromandaX 我想推到该州。由于状态是不可变的,所以我必须多次调用 setState
标签: javascript reactjs typescript promise