【问题标题】:How to append to the state whenever a promise is resolved?每当解决承诺时如何附加到状态?
【发布时间】: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

promise all

setState

【问题讨论】:

  • 所以最后,您实际上并不关心聚合结果,您只需要在它们履行时处理这些承诺。在这种情况下,您编写的助手可能就是要走的路。
  • 您希望here I want to setState() 被多次调用吗?即在您的示例中最多 3 次,每个已解决的承诺一次?
  • @raina77ow 基本上我正在获取一堆资源,我想尽可能显示它们。
  • @JaromandaX 我想推到该州。由于状态是不可变的,所以我必须多次调用 setState

标签: javascript reactjs typescript promise


【解决方案1】:

我没有找到任何原生的whenever,但是你基本上可以用forEach和一个高阶函数来构建它。

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

const PromiseWhenever = (promises, action, rejectionAction) => {
  promises.forEach(promise => {
    promise.then(action).catch(rejectionAction);
  });
}

PromiseWhenever([promise1, promise2, promise3], value => console.log(value), () => console.error("failed"))

现在如果你想要Promise.Whenever,你必须编辑Promise 的原型。值得吗?

对于setState,它将按您的预期工作:

PromiseWhenever([promise1, promise2, promise3], value =>
    this.setState({ values: this.state.values.concat([value]) }, () => console.error("failed"))

How do I resolve multiple promises as they resolve?setState inside promise.all() react 相关

【讨论】:

  • Promise.all 相比,使用这种方法要记住的一点是,使用Promise.all,状态将更新一次,导致仅重新渲染一次,而使用PromiseWhenever,您将有N 状态更新(N 是承诺的数量)和 N 次重新渲染。
  • 这是如何处理拒绝的?
  • @JaromandaX 提出的好观点。我想需要有一个拒绝处理程序传递给PromiseWhenever 函数,catch 方法应该用作:promise.then(action).catch(rejectionAction) 分别处理每个单独承诺的拒绝。
  • rejectionAction 的好点子。我会添加它。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 2021-08-04
  • 2019-03-11
  • 2020-09-07
  • 1970-01-01
  • 2016-12-13
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多