微信小程序、uni,Promise对象二次封装request请求

传统请求

在微信小程序中,网络请求已经做了类似jQuery的Ajax封装,但是在用法上还不够优美,在多级回调中也容易造成死亡嵌套,而在产生函数嵌套后会导致return返回值失效。在新的ES6语法中已经摈弃传统的基于XHR对象的网络请求,采用了新 API Fetch取代, fetch也是通过ES6中的Primise封装的。

fetch('https://')
.then(response => response.json()) //定义返回的类型和数据格式
.then(data => console.log(data)) // 返回的数据

这种调用方式更加美观高效,同时能够避免代码的多级嵌套,实现队列化调用。
在小程序中 request请求 无法通过return返回值的方式产生回调 用传统方式没有进一步优化的余地

Promise

  1. promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)
  2. 并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据
  3. 代码风格,容易理解,便于维护
  4. 多个异步等待合并便于解决[ Promise.all() ]
  5. promise有三个状态:
    • pending[待定]初始状态
    • fulfilled[实现]操作成功
    • rejected[被否决]操作失败
      当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
      promise状态一经改变,不会再变。(状态只能被改变一次)
new Promise((resolve, reject) => {
	resolve("这是正常情况抛出");//改变promise对象状态为 [实现]操作成功 .then()捕获
	reject("这是异常情况下的抛出")//改变promise对象状态为 [被否决]操作失败 .catch()捕获
})

也就是是说我们通过promise对象中的 resolve,reject抛出 等于函数中的 return
不同点:他们会改变所在promise对象状态
resolve(res) -》 操作成功(fulfilled) -》 调用.then(res)即可接收
reject(res) -》 操作失败(rejected) -》 调用.catch(res)即可接收

代码

let Server_url ="https://www...."
module.exports = {//抛出
  get: (option) => {//get请求封装
    return new Promise((resolve, reject) => {
      wx.request({
        url:  Server_url + option.url,
        data: option.data,
        method: 'GET',
        // header: { "Content-Type": "application/x-www-form-urlencoded"},//按需求改变
        success(res) {
             resolve(res);//请求成功 通过resolve(res);抛出正常
        },
        fail(res) {
          reject(res);//请求失败 通过resolve(res);抛出异常
        }
      })
    })
  },
  post: (option) => {//get请求封装
    return new Promise((resolve, reject) => {
      wx.request({
        url: Server_url + option.url,
        data: option.data,
        method: 'POST',
        // header: { "Content-Type": "application/x-www-form-urlencoded"},//按需求改变
        success(res) {
          resolve(res);//请求成功 将res返回做下一步处理
        },
        fail(res) {
          reject(res);
        }
      })
    })
  },
}

##调用

Ajax.get({url:'',data:{}})                 //Ajax对象调用 url补全,data=数据 除开url 其它都为非必须
    .then((res)=>{//请求成功的回调函数
      console.log(res)
    }).catch((res)=>{//捕获请求失败时的回调函数
      console.log(res)
 })
简化版
module.exports = {
	get:(url,data)=>new Promise((resolve,reject)=>{
		uni.request({
			url:url,
			data:data||'',
			method:"get",
			success(res){
				resolve(res);
			},
			fail(res){
				reject(res);
			}
		})
	}),
	post:(url,data)=>new Promise((resolve,reject)=>{
		uni.request({
			url:url,
			data:data||'',
			method:"post",
			success(res){
				resolve(res);
			},
			fail(res){
				reject(res);
			}
		})
	})
}

引入

import http from 'common/http.js';

使用

			http.get("https://www.....",{hello:"123"})
			.then(res=>{
				console.log(res)
			})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值