Proxy 封装微信小程序的异步调用

上回写到:

没看上回的同学,在这里

// utils/async.js

function wxPromisify(fn) {
    return async function(args) {
        return new Promise((resolve, reject) => {
            fn({
                ...(args || {}),
                success: res => resolve(res),
                fail: err => reject(err)
            });
        });
    };
}

export function toAsync(names) {
    return (names || [])
        .map(name => (
            {
                name,
                member: wx[name]
            }
        ))
        .filter(t => typeof t.member === "function")
        .reduce((r, t) => {
            r[t.name] = wxPromisify(wx[t.name]);
            return r;
        }, {});
}
// pages/somepage/somepage.js

import { toAsync } = require("../../utils/async");

// ...

const awx = toAsync(["login", "request"]);
await awx.login();
await awx.request({...});

这不已经封装过了吗?

这回写的是不一样的封装。因为,一个小程序里要写好多个 toAsync 调用,真的很烦呐!



能不能一次封装,到处调用?能!把所有用到的方法都在初始化的时候封装起来。可是,难免会有遗漏。

能不能一次封装,到处调用,还不需要初始化?

能!祭出 Proxy 大神:

// utils/asyncjs

function wxPromisify(fn) { ... }    // 前面已经定义过了

export function asyncProxy(target) {
    return new Proxy(target, {
        cache: {},
        get(it, prop) {
            const aFn = this.cache[prop];
            if (aFn) { return aFn; }
            const v = it[prop];
            if (typeof v !== "function") {
                return v;
            }
            return this.cache[prop] = wxPromisify(v);
        }
    });
}
// app.js
import { asyncProxy } from "./utils/async";

App({
    onLaunch: function() {
        wx.awx = asyncProxy(wx);
        // ....
    }
})
// pages/somepage/somepage
// ...
const { awx } = wx;
await awx.login();
await awx.request({...});


解释:

因为 awx 是代理的 wx 对象,调用 awx.login() 的时候,实际是先调用代理的 get(wx, "login"),找到用来代替 wx.login 的东西。

根据上面代码里的逻辑,先从 cache 里找使用 wxPromisify() 封装的结果,若有,直接返回;若没有,先封装成 Promise 网络的函数,存入 cache,再返回。

直观一点描述,大概是这样:

awx.login();
   ^^^^^^
   get(wx, "login")

最后出个题:像 wx.request() 这种原本就有返回值的情况,该如何封装呢?



喜欢此文,点个**

原文地址:https://blog.51cto.com/jamesfancy/2486056

时间: 2024-11-09 20:26:37

Proxy 封装微信小程序的异步调用的相关文章

微信小程序之----接口调用方式

最近开发了一个微信小程序版的任务管理系统,在向Java后台发送接口时遇到了一些问题,在这里做一个简单的总结. 官方接口 官方给出的接口叫做wx.request,请求方式比较简单,下面是官网给出的请求实例. wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'content-type': 'application/json' }, success: function(res) { co

微信小程序 子组件调用父组件方法

组件 js:  var value = 123; this.triggerEvent('callSomeFun', value) 父组件 wxml: <component bind:callSomeFun="onLoad"></component> 父组件 js : onLoad: function() { ... ... } 父组件调用子组件的方法 当父组件引用了子组件的时候,会遇到父组件执行子组件的方法 父组件中 wxml: <filter-cmp i

微信小程序使用promise封装异步请求

一:开发了一段时间的微信小程序,发现里面的API都是这样的: wx.showModal({ title: '提示', content: '这是一个模态弹窗', success: function(res) { if (res.confirm) { console.log('用户点击确定') } else if (res.cancel) { console.log('用户点击取消') } } }) 如果代码多了逻辑多了,就会出现所谓的回调地狱. wx.showModal({ title: '提示'

微信小程序异步处理

直接看问题: 然后看打印的结果: 根据上面两图可以看出,代码上先执行的网络请求,再执行打印的变量,但是从下面打印的结果来看,先出结果的是执行打印变量的函数(aafn函数),再打印出网络请求success的回调里返回的数据和赋值后的变量的值: 为什么先执行的aafn,并且打印的值没有赋值上? 因为wx.request是一个异步的请求,所以数据请求的同时,可以继续向下执行函数.所以这里值还没有赋值上就开始打印了变量的值: 这种情况,怎么解决呢? 方法一:  嵌套 在wx.request的succes

微信小程序学习指南

作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 微信小程序正式公测, 张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) ... 前言:新人第一坑,跳坑指南:修改后,必须保存:ctrl+S: 1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教

php 微信小程序支付

直接贴代码: 前端测试按钮wxml: <view class="container"> <text class="name">当前选择:<参加活动> ¥0.01</text> <view class="pay" bindtap="onTap">确认支付</view> </view> wxss: .container { padding: 50r

微信小程序访问webService(Java)

在前台UI确认后,终于进入到后台服务的搭建及实现中.所及而来的问题就出现了,为了提高后台程序的可用性.设计初期决定,通过搭建java WebService实现.准备工作还是比较充分的,创建WebService框架,实现接口方法.通过建立测试客户端调用java WebService方法.以上内容均已通过,就在最后通过微信小程序wx.request调用WebService接口时,问题出现了.标准的java WebService返回的为xml形式的soap描述文件,并非期待的json对象或json形式

微信小程序AES加密解密

微信小程序  其实在调用一些第三方 js的时候 其实没有大家想的那么复杂,无非就是把原生js调用方式   改为微信小程序 js调用方式 废话不多说直接贴代码 其实就是将原生function 或者 对象 赋值给 module.exports; 至于module.exports 不懂得 先去看微信开发文档 在这里就不多说了 本次讲一下主要思路 1.首先老规矩 去下载 原生aes.js 的 文件 https://github.com/hellobajie/AES-of-JavaScript 2.修改a

微信小程序之自定义tabbar

0. 官方指南 # 由于微信小程序的异步机制,页面跳转会出现随机事件 # 目的: 解决认证跳转过程的不友好体验 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 1. app.json文件的处理 1. 添加:"custom": true,使用自定义的tabbar 2. 将非tabbar的内容删除,删除的示例是发布,如下: "tabBar": {