Maison > Article > Applet WeChat > Le proxy encapsule les appels asynchrones de petits programmes
La dernière fois que j'ai écrit :
Pour ceux qui n'ont pas lu la dernière fois, le voici : Utilisez
async/await
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.jsimport { toAsync } = require("../../utils/async"); // ...const awx = toAsync(["login", "request"]);await awx.login();await awx.request({...});
Ce n'est pas déjà fait encapsulé ? Avez-vous réussi ?
Cette fois, j'ai écrit un package différent. Parce que c'est vraiment ennuyeux d'écrire plusieurs appels toAsync dans un petit programme !
Peut-il être encapsulé une fois et appelé partout ? capable! Encapsulez toutes les méthodes utilisées lors de l’initialisation. Mais il y aura inévitablement des omissions.
Peut-il être encapsulé une fois et appelé partout sans initialisation ?
Oui ! Faites ressortir le maître proxy :
// utils/asyncjsfunction 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.jsimport { asyncProxy } from "./utils/async"; App({ onLaunch: function() { wx.awx = asyncProxy(wx); // .... } })
// pages/somepage/somepage// ...const { awx } = wx;await awx.login();await awx.request({...});
Explication :
Parce que awx est l'objet wx du proxy, lors de l'appel à awx.login(), le proxy get(wx, "login" est en fait appelé en premier), trouvez quelque chose à utiliser à la place de wx.login .
Selon la logique du code ci-dessus, recherchez d'abord le résultat encapsulé à l'aide de wxPromisify() dans le cache. S'il y en a un, renvoyez-le directement, sinon, encapsulez-le d'abord dans une fonction de la promesse. réseau, stockez-le dans le cache, puis renvoyez-le.
Une description intuitive, probablement comme ceci :
awx.login(); ^^^^^^ get(wx, "login")
Tutoriel recommandé : "Compte officiel WeChat"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!