Le proxy encapsule les appels asynchrones de petits programmes

hzc
Libérer: 2020-06-05 10:00:09
avant
2910 Les gens l'ont consulté

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;
        }, {});
}
Copier après la connexion
// pages/somepage/somepage.jsimport { toAsync } = require("../../utils/async");
// ...const awx = toAsync(["login", "request"]);await awx.login();await awx.request({...});
Copier après la connexion

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);
        }
    });
}
Copier après la connexion
// app.jsimport { asyncProxy } from "./utils/async";

App({    onLaunch: function() {
        wx.awx = asyncProxy(wx);        // ....
    }
})
Copier après la connexion
// pages/somepage/somepage// ...const { awx } = wx;await awx.login();await awx.request({...});
Copier après la connexion

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")
Copier après la connexion

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!