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 toAsync
llamadas, 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 awx
un proxy wx
objeto, llamado awx.login()
tiempo, llame al agente realidad es get(wx, "login")
encontrar equipos usados en lugar de wx.login
las cosas.
La lógica del código anterior, el inicio cache
se 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 **