1.Promise对象基础
1.1 Promise 的状态
Promise有3种状态:
- Pending:进行中
- Resolved(Fulfilled):已完成
- Rejected:已失败
1.2 .then() 和 .catch()
Promise构造器接受一个函数作为参数,这个函数有两个参数:resolve,reject,分别代表这个Promise实例成功之后的回调函数和失败之后的回调函数。
不管是then方法还是catch方法返回的都是一个新的Promise实例,这意味着Promise可以链式调用then和catch,每一个方法的返回值作为下一个方法的参数
var promise = new Promise(function (resolve, reject) { var a = 1 if (a === 1) { resolve(a) } else { reject(error) }})promise.then(function (value) { console.log(value++) return value}).catch(function (error) { console.log(error)}).then(function (value) { console.log(value++)})// 输出:// 1// 21.3 Promise.resolve() 和 Promise.reject()
两者都是是new promise()的快捷方式。
Promise.resolve(42).then(function(value){ console.log(value); }); // 等同于 var promise = new Promise(function (resolve) { resolve(42) }) promise.then(function (value) { console.log(value) })1.4 Promise.all() 和 Promise.race()
Promise.all()
接收一个Promise对象的数组作为参数,当这个数组里的所有Promise对象全部变为resolve的时候,该方法才resolve。
如果其中一个Promise对象为reject的话,则该方法为reject。
// `delay`毫秒后执行resolvefunction timerPromisefy(delay) { return new Promise(function (resolve) { setTimeout(function () { resolve(delay); }, delay); });}// 当数组中所有Promise对象被resolve之后,该方法才返回Promise.all([ timerPromisefy(1), timerPromisefy(32), timerPromisefy(64), timerPromisefy(128)]).then(function (value) { console.log(value); });//输出: [ 1, 32, 64, 128 ]2. 小程序wx.request
wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '', y: '' }, header: { 'content-type': 'application/json' // 默认值 }, success (res) { console.log(res.data) }})

3. 用Promise封装wx.request
class HttpClient { constructor() { this.xhr = wx.request; } checkArguments(args) { if (!args.length) return false; let originalParam = args[0]; let param = Object.create(null); if (typeof originalParam === 'string' && originalParam.length) { param.url = originalParam; return param; } else if (Utils.isObject(originalParam)) { let method = (originalParam.method || 'GET').toUpperCase(); if (METHODS.toString().indexOf(method) === -1) { Utils.warn( `HttpClient request warning : Request method should be ${METHODS.join( '/', )}`, ); method = 'GET'; } else if (method === 'POST') { !Utils.isObject(originalParam.header) && (originalParam.header = {}); originalParam.header['content-type'] = 'application/x-www-form-urlencoded'; } return Object.assign(param, originalParam, { method }); } return false; } request(...args) { let params = this.checkArguments(args); if (!params) throw new Error('HttpClient request error : Invalid parameters'); return new Promise((resolve, reject) => { params['success'] = response => { if (response.statusCode === 200) resolve(response.data); else reject(response); }; params['fail'] = reject; this.xhr(params); }); }}export default new HttpClient();调用方法
getSupportResult() { return HttpClient.request({ url: , method: 'POST', data: { } }) .then(res => { }) .catch((e) => { }); },













