ホームページ  >  記事  >  WeChat アプレット  >  プロキシは小さなプログラムの非同期呼び出しをカプセル化します。

プロキシは小さなプログラムの非同期呼び出しをカプセル化します。

hzc
hzc転載
2020-06-05 09:39:342976ブラウズ

前回書きました:

前回を読んでいない人のために、ここにあります: Use 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({...});
# in WeChat ミニ プログラム ##これはすでにカプセル化されているのではありませんか?

今回は別のパッケージを書きました。なぜなら、小さなプログラムで複数の toAsync 呼び出しを記述するのは本当に面倒だからです。


一度カプセル化すればどこでも呼び出すことができますか?できる!初期化中に使用されるすべてのメソッドをカプセル化します。ただし、漏れは避けられません。

一度カプセル化すれば、初期化せずにどこでも呼び出すことができますか? ######できる!プロキシ マスターを誇示します:

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

説明:

awx はプロキシの wx オブジェクトであるため、awx.login() を呼び出すと、プロキシの get(wx, "login" は実際には最初に呼び出されます)、 wx.login の代わりに使用するものを見つけてください。

上記のコードのロジックによると、まず wxPromisify() を使用してカプセル化された結果をキャッシュから探します。存在する場合は直接返します。存在しない場合は、最初にそれを Promise の関数にカプセル化します。ネットワークにアクセスし、キャッシュに保存してから返します。

直観的な説明は次のようになります:

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

推奨チュートリアル: 「

WeChat パブリック アカウント

以上がプロキシは小さなプログラムの非同期呼び出しをカプセル化します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。