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

hzc
リリース: 2020-06-05 10:00:09
転載
2954 人が閲覧しました

前回書きました:

前回を読んでいない人のために、ここにあります: 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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!