网络请求(二)

回调函数

import Http from "../utils/Http";
import APIConfig from "../config/api";

class Service {
    
    

    /**
     *  分页获取服务列表
     * @param page
     * @param count
     * @param category_id 可以为null,
     * @param type
     */
    getServiceList(page, count, category_id = null, type = null) {
    
    
        console.log('获取服务列表')
        //发起网络请求,获取数据
        //统一的响应,异常处理
        const res = Http.request({
    
    url: 'v1/service/list', data: {
    
    page, count}},
            function (result) {
    
     //添加回调函数
                console.log(result)
            })
    }
}

调用回调函数,传递结果

	......
    static request({
    
    url, data, method = 'GET'},callBack) {
    
    
        wx.request({
    
    
            url:APIConfig.baseUrl+url,
            data,
            method,
            success:(result)=>{
    
    
                //全局统一响应、异常处理
                if (result.statusCode<400) {
    
    
                    callBack(result) //调用回调函数,回传结果
                }
                ......
            }
        })
    }
    ......

Promise 解决回调地狱

菜鸟教程Promise学习:https://www.runoob.com/w3cnote/javascript-promise-object.html
小程序一些原生Api不支持Promise,其中wx.request()不支持需要将其转为Promise,来解决回调地狱问题

在工具文件夹中utils文件夹中创建转Promise工具:

export default function wxToPromise(method, options = {
     
     }) {
    
    
// resolve(解析)和 reject(拒绝)
    return new Promise((resolve, reject) => {
    
    
        options.success = resolve
        options.fail = err => {
    
    
            reject(err)
        }
        wx[method](options)
    })
}
  1. 使用Promise,去掉回调事件
import APIConfig from "../config/api";
import exceptionMessage from "../config/exception-message";
import wxToPromise from "./wx";

class Http {
    
    
    static request({
    
    url, data, method = 'GET'}) {
    
    

		//wxToPromise中的'requset'是wx.request中,request的方法名
        const res = wxToPromise('request', {
    
    
            url: APIConfig.baseUrl + url,
            data,
            method
        })
		//返回结果
        return res.then((result)=>{
    
    
            console.log(result)
            //全局统一响应、异常处理
            //请求成功
            if (result.statusCode < 400) {
    
    
                return result.data.data //直接返回结果
            }
            //请求失败
            if (result.statusCode === 401) {
    
    
                return
            }

            //打印错误信心
            Http._showError(result.data.error_code)
        })
    }
	......
}

export default Http
  1. 查看返回结果
class Service {
    
    

    /**
     *  分页获取服务列表
     * @param page
     * @param count
     * @param category_id 可以为null,
     * @param type
     */
    getServiceList(page, count, category_id = null, type = null) {
    
    
        console.log('获取服务列表')
        //发起网络请求,获取数据
        //统一的响应,异常处理
       	//使用Promise直接返回结果
       	//返回了一个Promise对象
        const res = Http.request({
    
    url: 'v1/service/list', data: {
    
    page, count}})
        res.then(res1=>{
    
    
        	//取出结果
            console.log(res1) 
        })
    }
}

export default Service

再次改进,使用async/await

  1. 在方法中添加async和await
class Http {
    
    
    static async request({
    
    url, data, method = 'GET'}) {
    
    

        const result = await wxToPromise('request', {
    
    
            url: APIConfig.baseUrl + url,
            data,
            method
        })

        //全局统一响应、异常处理
        //请求成功
        if (result.statusCode < 400) {
    
    
            return result.data.data //直接返回结果
        }
        //请求失败
        if (result.statusCode === 401) {
    
    
            return
        }

        //打印错误信心
        Http._showError(result.data.error_code)
    }
    ......
}
import Http from "../utils/Http";
import APIConfig from "../config/api";

class Service {
    
    
    /**
     *  分页获取服务列表
     * @param page
     * @param count
     * @param category_id 可以为null,
     * @param type
     */
    async getServiceList(page, count, category_id = null, type = null) {
    
    
        //发起网络请求,获取数据
        //统一的响应,异常处理
           // const res = await Http.request({url: "v1/service/list", data: {page, count}})
        // return res
        //直接返回不需要加await
        return Http.request({
    
    url: 'v1/service/list', data: {
    
    page, count}})
    }
}
export default Service
import Service from "../../model/service";

const service = new Service()
Page({
    
    
    data: {
    
    },
    onLoad: function (options) {
    
    
        this._getServiceList()
        // service.getToken()
    },

    //页面私有的函数,我们通常用下划线开头
    async _getServiceList() {
    
    
        //发起网络请求,获取服务列表的数据
        const serviceList = await service.getServiceList(1, 10)
        console.log('打印列表')
        console.log(serviceList)
    }
});

示例二:从服务器获取分类数据

1、创建模型文件category.js

class Category {
    
    
    static async getCategoryList() {
    
    
        return Http.request({
    
    
            url: 'v1/category'
        })
    }

    static async getCategoryListWithAll() {
    
    
        const categoryList = await Category.getCategoryList()
        //在list插入数据:全部
        categoryList.unshift({
    
    id: 0, name: '全部'})
        return categoryList
    }
}

export default Category

2、使用数据

    onLoad: function (options) {
    
    
        this._getCategoryList()
    },

 	......

    async _getCategoryList() {
    
    
        const categoryList = await Category.getCategoryListWithAll()
        this.setData({
    
    
            categoryList:categoryList
        })
    },

猜你喜欢

转载自blog.csdn.net/xiaoduzi1991/article/details/120849660
今日推荐