Heim  >  Artikel  >  WeChat-Applet  >  Proxy kapselt asynchrone Aufrufe kleiner Programme

Proxy kapselt asynchrone Aufrufe kleiner Programme

hzc
hzcnach vorne
2020-06-05 09:39:342961Durchsuche

Das letzte Mal habe ich geschrieben:

Für diejenigen, die das letzte Mal nicht gelesen haben, hier ist es: using 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({...});

Ist das nicht schon so? gekapselt?

Diesmal habe ich ein anderes Paket geschrieben. Weil es wirklich nervig ist, mehrere toAsync-Aufrufe in einem kleinen Programm zu schreiben!


Kann es einmal gekapselt und überall aufgerufen werden? fähig! Kapseln Sie alle während der Initialisierung verwendeten Methoden. Es wird jedoch zwangsläufig Auslassungen geben.

Kann es einmal gekapselt und überall ohne Initialisierung aufgerufen werden?

Ja! Rufen Sie den Proxy-Master auf:

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

Erläuterung:

Da awx das wx-Objekt des Proxys ist, lautet beim Aufruf von awx.login() tatsächlich get(wx, „login“ des Proxys zuerst aufgerufen), finden Sie etwas, das Sie anstelle von wx.login verwenden können.

Suchen Sie gemäß der Logik im obigen Code zunächst nach dem mit wxPromisify() gekapselten Ergebnis aus dem Cache. Wenn nicht, kapseln Sie es zuerst in eine Funktion des Versprechens Netzwerk, speichern Sie es im Cache und geben Sie es dann zurück.

Eine intuitive Beschreibung, wahrscheinlich so:

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

Empfohlenes Tutorial: „WeChat Official Account

Das obige ist der detaillierte Inhalt vonProxy kapselt asynchrone Aufrufe kleiner Programme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen