Js Es6 Promise Chaining
Solution 1:
Your first .then
call is returning undefined
, whereas any subsequent .then
is expecting a returned promise. So you'd need to change your code to:
var test = newPromise(function(resolve, reject){
resolve('done1');
});
var test2 = newPromise(function(resolve, reject){
resolve('done2');
});
test
.then(function(data) {
console.log(data);
return test2;
})
.then(resultOfTest2 => doSomething)
.then(function(data) {
console.log(data);
});
Solution 2:
You need to return next promise from the then
callback:
test.then(function(data) {
console.log(data);
return test2;
}).then(function(data) {
console.log(data);
});
Solution 3:
Summary:
The basic concept of promise chaining with promises is that every then
/ catch
method on a fulfilled promise returns another promise. It works in the following manner:
- When a promise is resolved the callback passed in the
then
method is called. Thethen
method wraps the value which is returned in its callback in a resolved promise and returns this resolved promise. - When a promise is rejected the callback passed in the
catch
method is called. Thecatch
method wraps the value which is returned in its callback in a rejected promise and returns this rejected promise.
Example:
Before fully understanding the concept of chaining multiple then
methods it is important to know what exactly the return values of then
and catch
are. Take the following example:
let prom1 = newPromise((res, rej) => {
res('res');
});
const resolvedProm1 = prom1.then((val) => {return val});
// setTimeout needed for the promise to actually be resolvedsetTimeout(() =>console.log(resolvedProm1));
let prom2 = newPromise((res, rej) => {
rej('rej');
});
const resolvedProm2 = prom2.catch((err) => {throw err});
// setTimeout needed for the promise to actually be rejectedsetTimeout(() =>console.log(resolvedProm2));
We can observe the status of the promises in the chrome devtools:
What basically happens is that in a then
or catch
callback is the following:
- Any value returned in a
then
orcatch
callback is wrapped inPromise.resolve()
and a new resolved promise is returned. - Any error thrown in a
then
orcatch
callback is wrapped inPromise.reject()
and a new rejected promise is returned.
Because we are getting returned a rejected or resolved promise object we can repeat the cycle and call the then
or catch
method on it again. For example:
const prom = newPromise((res, rej) => {
if (Math.random() > 0.5) {
res('success');
} else {
rej('error');
}
});
prom.then((val) => {
return val;
}).then((val) => {
return val
}).then((val) => {
console.log(val)
}).catch((err) => {
console.log('err');
})
This calling of then
and catch
methods which are executed in their respective order is called promise chaining. It is a very useful technique to make working with asynchronous code easier, especially if multiple asynchronous operations need to be performed which are dependend on each others data.
Solution 4:
you need to return the other promise(test2) in the first promise (test1) to allow for chaining:
var test = newPromise(function(resolve, reject){
resolve('done1');
});
var test2 = newPromise(function(resolve, reject){
resolve('done2');
});
test
.then(function(data) {
console.log(data);
return test2;
});
Solution 5:
You may also want to try -
let test = newPromise(function(resolve, reject){
resolve('done1');
});
let test2 = newPromise(function(resolve, reject){
resolve('done2');
});
try {
let logOne = test();
let logTwo = test2();
console.log(logOne);
console.log(logTwo);
} catch(error) {
console.error(error);
}
In this way, you can also properly handle any promise dependencies. For example if test one relied on test two's data your could -
try {
let logOne = test();
let logTwo = test2(logOne);
console.log(logOne);
console.log(logTwo);
} catch(error) {
console.error(error);
}
Post a Comment for "Js Es6 Promise Chaining"