先说一下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也可以捕捉到错误