一个Promise可以处于pending状态多久?

9

我正在使用Angular(4)项目中的Promise,并且有一个关于它们的问题,在文档中找不到答案。

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

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

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

非常感谢


2个回答

5
new Promise(() => {})永远不会被解决,就像从未调用的回调一样。
一个promise是一个返回对象,你可以将回调函数附加到这个对象上,而不是将回调函数传递给函数。那就是全部内容。它并不是刚刚启动的异步操作的控制面板。
如果有的话,请查看您调用的异步API以获取此类控件。

创建 Promises

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

5

一个 Promise 可以在页面加载的时候保持处于 pending 状态。

你可以将调用包装在另一个 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可以存在于单例存在的时间内,或者它的生命周期可以超过创建它的服务的生命周期?这背后是否有垃圾回收策略? - orouwk
浏览器对HTTP请求有一些超时时间 https://dev59.com/oGw05IYBdhLWcg3wVwc4。当这种情况发生时,Future将会以错误的方式完成。在此之前,它将一直存在于内存中。 - Günter Zöchbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接