Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How long a Promise can remain in pending state?

I'm using Promises in Angular (4) project and I have a question about them that I couldn't find a response to it in the docs.

When I create a Promise, I basically wait for an async answer from a service/party. But how long should I expect this Promise to stay in pending state? Is there any mechanism that will terminate it after a while? How reliable is this concept of waiting/pending?

Let's suppose that I need to get some data from a busy service that can answer even after few minutes of waiting, maybe more, no matter if the computing of the response is a resource intensive process or that service is linked with another one that is responding very slow. Is there anything on the client side that will somehow terminate my Promise and determine/force to create another one to ask again for my data?

Someone suggested to upgrade to Observables, and I will do that, but for now I want to keep using Promises, at least for some areas of the code.

Tks a lot

like image 389
orouwk Avatar asked May 17 '17 15:05

orouwk


People also ask

What is the meaning of promise pending?

The promise will always log pending as long as its results are not resolved yet. You must call .then on the promise to capture the results regardless of the promise state (resolved or still pending): let AuthUser = function(data) { return google.

When a promise object is in the pending state the result is?

The Promise object supports two properties: state and result. While a Promise object is "pending" (working), the result is undefined. When a Promise object is "fulfilled", the result is a value.

In which states can a promise be?

A Promise is in one of these states: pending: initial state, neither fulfilled nor rejected. fulfilled: meaning that the operation was completed successfully. rejected: meaning that the operation failed.

How do you know if a promise is resolved?

The Promise. resolve() method "resolves" a given value to a Promise . If the value is a promise, that promise is returned; if the value is a thenable, Promise. resolve() will call the then() method with two callbacks it prepared; otherwise the returned promise will be fulfilled with the value.


2 Answers

A Promise can be in pending state as long as the page is loaded.

You can wrap the call in another Promise where you introduce a timeout like shown in

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

This will cause an error when the timeout is reached. It will still wait to receive the full response. An Observable might be able to forward a cancellation and close the connection, so that the result isn't even received anymore when the timeout is reached. This might depend on whether the concrete implementation and the browser used browser API supports that.

like image 64
Günter Zöchbauer Avatar answered Sep 28 '22 03:09

Günter Zöchbauer


new Promise(() => {}) will never settle, like a callback never called.

A promise is a return object you attach callbacks to, instead of passing callbacks into the function. That's all. It is not a control surface of the asynchronous operation that was just started.

Instead, look to the asynchronous API you called for such controls, if it has them.

Creating promises

Most people are consumers of promises returned from asynchronous APIs. There's no reason to create a Promise other than to wrap a legacy callback API. In an ideal world there'd be no need.

like image 34
jib Avatar answered Sep 28 '22 03:09

jib