Proxy 패키지 위 챗 애플 릿 의 비동기 호출

다음 에 썼 습 니 다:
지난번 동창 을 보지 못 했 습 니 다.여기 있 습 니 다.
위 챗 애플 릿 에 async/await 사용 하기
// utils/async.js

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.js

import { toAsync } = require("../../utils/async");

// ...

const awx = toAsync(["login", "request"]);
await awx.login();
await awx.request({...});

이것 은 이미 봉인 되 지 않 았 습 니까?
이번에 쓴 것 은 다른 봉투 다.작은 프로그램 에 여러 개toAsync호출 을 써 야 하기 때문에 정말 귀 찮 습 니 다!
한 번 에 포장 해서 여기저기 서 호출 할 수 있 습 니까?네!사용 하 는 모든 방법 을 초기 화 할 때 밀봉 하 다.하지만 빠 질 수 밖 에 없다.
한 번 에 포장 하고 여기저기 서 호출 할 수 있 습 니까?초기 화 할 필요 가 없습니다.
네!프 록 시 대신 에 게 제사 지내 기:
// utils/asyncjs

function 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.js
import { 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할 물건 을 찾 았 기 때문이다.
위 코드 의 논리 에 따라cache에서 사용wxPromisify()봉 인 된 결 과 를 찾 고 있 으 면 바로 되 돌려 줍 니 다.없 으 면 Promise 네트워크 로 봉 인 된 함수 로 저장cache하고 되 돌려 줍 니 다.
직관 적 으로 묘사 하면 대략 이렇다.
awx.login();
   ^^^^^^
   get(wx, "login")

공중 번호 변경 객 잔 을 주목 하 세 요.
다 봤 으 면 가지 말고 좋아요 눌 러 주세요.

좋은 웹페이지 즐겨찾기