【问题标题】:Can I clone a Promise?我可以克隆一个 Promise 吗?
【发布时间】:2016-08-31 23:46:42
【问题描述】:

我有一个返回承诺的异步函数。该操作只能执行一次。我希望该函数的所有调用者都能取回相同的 Promise,但我不希望一个调用者的 .catch()es 影响另一个调用者。我可以克隆一个 Promise,或者以其他方式实现它吗?

【问题讨论】:

标签: javascript promise


【解决方案1】:

但我不希望一个呼叫者的.catch()es 影响另一个呼叫者。

他们从不1这样做(除非你链接了回调,但你没有这样做)。

我希望该函数的所有调用者都返回相同的 Promise

就去做吧。 Promise 是不可变的值2.

我可以克隆一个承诺吗?

如果您确实需要3 一个遵循原始承诺的不同对象(当它完成时执行或在它拒绝时拒绝),您可以使用不带参数的then 方法:

var clone = promise.then();
console.assert(clone !== promise);

1:假设你使用了一个合适的 Promise 库。我想我记得一个库(旧 jQuery?)的案例,其中then 回调结果改变了承诺的状态。
2:至少在他们的解决行为中。当然,每个承诺仍然只是一个对象。
3:你没有。你真的不应该。我只是在回答标题问题,但你应该停止做奇怪的事情。

【讨论】:

  • 为什么你需要一个独特的对象跟在第一个对象之后?如果您希望多个关注者具有相同的解析/拒绝,为什么不让多段代码都使用相同的承诺?
  • @jfriend00:我不知道,人们在用 Promise 做一些奇怪的事情,我正在考虑你不想分享的 object 上的自定义属性.此外,分发多个不同的 Promise 实例可能会对取消产生影响(取决于实现语义)。但是,是的,在通常情况下,您应该只重用完全相同的承诺。我需要在答案中更清楚地说明这一点吗?
  • 我认为您可能应该更清楚地说明 99% 的时间(基本上总是,除非您对 Promise 对象本身做一些非标准的事情),您不需要另一个 Promise 并且所有的代码都可以只看同一个promise。
  • 我能想到的一个用例是一个“深度克隆”实用程序,它试图友好地使用代码,即它假设承诺是可变的,因此最好尝试克隆它。跨度>
  • @aaaaaa 是的,但是 promise 通常不应该有可变的自定义属性。但是当你不相信你的消费者不会安装它们时,分发同一个承诺的多个“副本”确实很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2011-09-30
  • 2022-06-20
  • 2010-10-01
  • 2020-10-28
  • 2018-12-07
  • 2010-12-17
相关资源
最近更新 更多