代码改变世界

ES6 Promise

2017-05-08 10:56  改吧  阅读(502)  评论(4编辑  收藏  举报

先说一下Promise的作用吧

首先可以实现异步编程

然后你有异步方法的时候,可以通过Promise的then方法来实现同步执行

Promise的resolve()就是保存结果,作为参数传给then()

reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。传给catch()

 

 

 

最近在做小程序,

小程序的request请求都是异步的,没有同步设置,然后就想着用Promise来同步代码,

最简单的就是用这种Promise,然后再then

        // 获取用户地理位置
        var p1 = new Promise(function(resolve, reject) {
            util.getLocation(function(res) {
                var point = {
                    latitude: res.latitude,
                    longitude: res.longitude
                }
                // app.globalData.point = point
                that.setData({
                    point: point
                })
                resolve(that.data.point)
            })
        })
    p1.then(function() {
            util.wxAuthGet('/order/list', {
                long:that.data.point.longitude,
                lat: that.data.point.latitude,
                type: that.data.type,
                page: 1
            }, function(data) {
                var index = that.data.type - 1;
                // 当前标签的列表
                that.data.orderList[index] = data;

                // 创建ad=[{},{},{}]
                var ad = [];
                for (var i = data.length - 1; i >= 0; i--) {
                    ad.push({})
                };


                that.data.animationData[index] = ad;
                // 渲染
                that.setData({
                    orderList: that.data.orderList,
                    animationData: that.data.animationData,
                    dataId: that.data.type
                });
                // 隐藏toast
                wx.hideToast();
            }, null, '', that);

 这段代码的意思是获取自己的位置成功后获取数据,因为在小程序里面获取自己的位置也需要时间,我需要先获取地理位置再执行下面的代码

 如果Promise里面有多个异步请求,for循环,可以用

Promise.all(addrs.map((item, index) => makePromise(item, that))).then(res => {
                    console.log(that.data.allDis)
                        // console.log(allDis)
                    console.log('这是在哪里进行')
                    for (var i = 0; i < addrs.length; i++) {
                        var dis = {
                            tDis: res[i].takeDis,
                            sDis: res[i].sendDis
                        }
                        that.data.allDis[cur].push(dis)
                    }
                    that.setData({
                        allDis: that.data.allDis
                    })
                    console.log('hello', that.data.allDis[1])
                })

  Promise.all语法糖

还有一个很重要的语法,就是Promise里面的reject

也就是用catch捕捉的错误信息

// bad
p
  .then(function(data) {
    // success
  }, function(err) {
    // error
  });

// good
p
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

catch捕捉promise里的reject()里面的错误信息哦

当p函数里面有错误信息时,catch也可以捕捉到错误