【问题标题】:How long a Promise can remain in pending state?Promise 可以保持挂起状态多长时间?
【发布时间】:2017-05-17 15:19:04
【问题描述】:

我在 Angular (4) 项目中使用 Promises,我有一个关于它们的问题,但我在文档中找不到对它的回应。

当我创建一个 Promise 时,我基本上是在等待来自服务/聚会的异步回答。但是我应该期望这个 Promise 保持挂起状态多长时间? 是否有任何机制会在一段时间后终止它? 这种等待/挂起的概念有多可靠?

假设我需要从一个繁忙的服务中获取一些数据,即使等待几分钟甚至更多,也可能需要更多的数据,无论响应的计算是一个资源密集型过程还是该服务与另一个相关联那是响应非常缓慢。 客户端是否有任何东西会以某种方式终止我的 Promise 并确定/强制创建另一个以再次询问我的数据?

有人建议升级到 Observables,我会这样做,但现在我想继续使用 Promises,至少在代码的某些区域。

非常感谢

【问题讨论】:

标签: javascript angular es6-promise


【解决方案1】:

只要页面加载完毕,Promise 就可以处于挂起状态。

您可以将调用包装在另一个 Promise 中,您可以在其中引入超时,如

所示
let wrappingPromise = new Promise((resolve, reject) => {
  var error = false;
  setTimeout(function(){
    reject("some error"); 
  }, 3000);
  this.http.get(...).toPromise().then(res => {
    if(!error) {
      resolve(res.json);
    }
  });
}); 

这将在达到超时时导致错误。 它仍然会等待接收完整的响应。 Observable 可能能够转发取消并关闭连接,以便在达到超时时甚至不再收到结果。这可能取决于具体实现和浏览器使用的浏览器 API 是否支持。

【讨论】:

  • 当您说“只要页面已加载”时,您的意思是只要我不再重新加载整个应用程序(刷新页面)?作为对 http 服务的调用,这是我在服务中所做的事情(大多数时候是单例),其中一些是在应用程序启动时加载的。这意味着只要单例存在,Promise 就可以存在,或者它的生命周期可以跨越创建它的服务的时间?这背后有什么垃圾回收策略吗?
  • 浏览器对 HTTP 请求 stackoverflow.com/questions/7297833/… 有一些超时。发生这种情况时,Future 将完成并出现错误。在那之前,它会留在记忆中。
【解决方案2】:

new Promise(() => {}) 永远不会解决,就像从未调用过的回调一样。

promise 是一个返回对象,您可以将回调附加到该对象,而不是将回调传递给函数。就这样。它不是刚刚开始的异步操作的控制界面。

相反,请查看您为此类控件调用的异步 API(如果有)。

创建承诺

大多数人都是从异步 API 返回的 Promise 的消费者。除了包装遗留回调 API 之外,没有理由创建 Promise。在理想的世界里是没有必要的。

【讨论】:

    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多