promise链式调用
文章参考
https://segmentfault.com/a/1190000007598894
http://es6.ruanyifeng.com/#docs/promise#Promise-prototype-then
Promise.prototype.then()
Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。
它的作用是为 Promise 实例添加状态改变时的回调函数。前面说过,then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。
then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。
getJSON("/posts.json").then(function(json) { return json.post; }).then(function(post) { // ... });
上面的代码使用then方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。
采用链式的then,可以指定一组按照次序调用的回调函数。这时,前一个回调函数,有可能返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用。
例子说明:
function start() { return new Promise((resolve, reject) => { resolve('start'); }); } start() .then(data => { // promise start console.log('result of start: ', data); return Promise.resolve(1); // p1 }) .then(data => { // promise p1 console.log('result of p1: ', data); return Promise.reject(2); // p2 }) .then(data => { // promise p2 console.log('result of p2: ', data); return Promise.resolve(3); // p3 }) .catch(ex => { // promise p3 console.log('ex: ', ex); return Promise.resolve(4); // p4 }) .then(data => { // promise p4 console.log('result of p4: ', data); });
上面的代码最终会输出:
result of start: start
result of p1: 1
ex: 2
result of p4: 4