Question
I'm looking at this example from Angular's documentation for $q
, but I think
this probably applies to promises in general. The example below is copied
verbatim from their documentation with their comment included:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
I'm not clear how this works. If I can call .then()
on the result of the
first .then()
, chaining them, which I know I can, then promiseB
is a
promise object, of type Object
. It is not a Number
. So what do they mean
by "its value will be the result of promiseA incremented by 1"?
Am I supposed to access that as promiseB.value
or something like that? How
can the success callback return a promise AND return "result + 1"? I'm missing
something.
Answer
promiseA
's then
function returns a new promise (promiseB
) that is
immediately resolved after promiseA
is resolved, its value is the value of
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
});
As of ECMAScript
2016
(ES7, 2016), async
/await
is standard in JavaScript, 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.