ES6:Promise学习

2016-12-25  本文已影响21人  开车去环游世界

http://es6.ruanyifeng.com/#docs/promise#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对象的状态发生变化,才会被调用。

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function funcA(comments) {
  console.log("Resolved: ", comments);
}, function funcB(err){
  console.log("Rejected: ", err);
});

上面代码中,第一个then方法指定的回调函数,返回的是另一个Promise对象。这时,第二个then方法指定的回调函数,就会等待这个新的Promise对象状态发生变化。如果变为Resolved,就调用funcA,如果状态变为Rejected,就调用funcB。

如果采用箭头函数,上面的代码可以写得更简洁。

getJSON("/post/1.json").then(
  post => getJSON(post.commentURL)
).then(
  comments => console.log("Resolved: ", comments),
  err => console.log("Rejected: ", err)
);

学习例子:

get (url) {
    return new Promise((resolve, reject) => {
        console.log(url);
        wx.request({
            url: url,
            headers: {
                'Content-Type': 'application/json'
            },
            success: (res) => {
                resolve(res);
            },
            fail: (res) => {
                reject(res);
            }
        });
    });
},

getData() {
    api.get( "http://wan.liebao.cn/action/api/newest_server.php?rt=1&ver=2.0&act=open&limit=16" )
        .then(
            res => {
                console.log( "第一个 then 后返回的数据:", res );
                return api.get( "http://wan.liebao.cn/action/api/newest_server.php?rt=1&ver=2.0&act=expect&limit=16" );
            }
        )
        .then(
            res => {
                console.log( "第二个 then 后返回的数据(是从第一个 then 中 api.get 获取数据传过来的):", res );
                console.log( res.data.data.servers );
            },
            err => {
                throw new Error("uh oh");
                console.log( err );
            }
        );
},

getData2() {
    api.get( "http://wan.liebao.cn/action/api/newest_server.php?rt=1&ver=2.0&act=open&limit=16" )
        .then(
            res => {
                return res.data.data.servers;
            }
        )
        .then(
            res => {
                // 第一个(then)回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。
                console.log( res );
            },
            err => {
                throw new Error("uh oh");
                console.log( err );
            }
        );
}

上面的代码使用then方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。第二个 then 后返回的数据(是从第一个 then 中 api.get 获取数据传过来的。

上一篇下一篇

猜你喜欢

热点阅读