How to access the value of a promise?
When a promise is resolved/rejected, it will call its success/error handler:
var promiseB = promiseA.then(function(result) {
// do something with result
});
The then
method also returns a promise: promiseB, which will be resolved/rejected depending on the return value from the success/error handler from promiseA.
There are three possible values that promiseA's success/error handlers can return that will affect promiseB's outcome:
1. Return nothing --> PromiseB is resolved immediately,
and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved.
When rejected, promiseB will be rejected. The value passed to
the promiseB's then handler will be the result of the promise
Armed with this understanding, you can make sense of the following:
promiseB = promiseA.then(function(result) {
return result + 1;
});
The then call returns promiseB immediately. When promiseA is resolved, it will pass the result to promiseA's success handler. Since the return value is promiseA's result + 1, the success handler is returning a value (option 2 above), so promiseB will resolve immediately, and promiseB's success handler will be passed promiseA's result + 1.
promiseA
's then
function returns a new promise (promiseB
) that is immediately resolved after promiseA
is resolved, its value is the value of the what is returned from the success function within promiseA
.
In this case promiseA
is resolved with a value - result
and then immediately resolves promiseB
with the value of result + 1
.
Accessing the value of promiseB
is done in the same way we accessed the result of promiseA
.
promiseB.then(function(result) {
// here you can use the result of promiseB
});
Edit December 2019: async
/await
is now standard in JS, which allows an alternative syntax to the approach described above. You can now write:
let result = await functionThatReturnsPromiseA();
result = result + 1;
Now there is no promiseB, because we've unwrapped the result from promiseA using await
, and you can work with it directly.
However, await
can only be used inside an async
function. So to zoom out slightly, the above would have to be contained like so:
async function doSomething() {
let result = await functionThatReturnsPromiseA();
return result + 1;
}
And, for clarity, the return value of the function doSomething
in this example is still a promise - because async functions return promises. So if you wanted to access that return value, you would have to do result = await doSomething()
, which you can only do inside another async function. Basically, only in a parent async context can you directly access the value produced from a child async context.
.then
function of promiseB receives what is returned from .then
function of promiseA.
here promiseA is returning is a number, which will be available as number
parameter in success function of promiseB. which will then be incremented by 1