Proxy encapsulado micro-canal applet de llamada asincrónica

En la parte posterior está escrito:

No me imagino a los estudiantes de vuelta en aquí !

// 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({...});

Este paquete no ha sido todavía?

Esta escritura no simultánea no es el mismo paquete. Debido a que, en un pequeño programa escrito a múltiples toAsyncllamadas, realmente molesto na!


¿Puede un paquete, llamar a todas partes? Puede! Todos los métodos se utilizan para el tiempo de inicialización encapsulado. Sin embargo, inevitablemente, habrá omisiones.

¿Puede un paquete, llame a su alrededor, no es necesario para inicializar?

Puede! Proxy recurrió Gran Dios:

// 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({...});

explicación:

Debido a awxun proxy wxobjeto, llamado awx.login()tiempo, llame al agente realidad es get(wx, "login")encontrar equipos usados en lugar de wx.loginlas cosas.

La lógica del código anterior, el inicio cachese utilizó para encontrar wxPromisify()los resultados de encapsulación, en su caso, el retorno directo; si no, el paquete en función de la primera red de Promise, almacena cache, y luego regresar.

Descripción del punto intuitiva, algo como esto:

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

Por último, de una pregunta: al igual que wx.request()el caso de esta había tenido un valor de retorno, cómo empaquetarlo?


Al igual que este artículo, apunte a **

Supongo que te gusta

Origin blog.51cto.com/jamesfancy/2486056
Recomendado
Clasificación