>  기사  >  위챗 애플릿  >  프록시는 작은 프로그램의 비동기 호출을 캡슐화합니다.

프록시는 작은 프로그램의 비동기 호출을 캡슐화합니다.

hzc
hzc앞으로
2020-06-05 09:39:342954검색

저번에 쓴 글:

저번에 읽지 않은 분들을 위해 여기 있습니다: WeChat 미니 프로그램에서 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({...});

를 사용하면 이미 캡슐화되어 있지 않나요?

이번에는 다른 패키지를 작성해봤습니다. 작은 프로그램에서 여러 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를 대체합니다.

위 코드의 논리에 따라 먼저 캐시에서 wxPromisify()를 사용하여 캡슐화된 결과를 찾습니다. 결과가 있으면 직접 반환하고, 그렇지 않으면 먼저 Promise 네트워크의 함수로 캡슐화하여 저장합니다. 캐시에 저장한 다음 반환하세요.

다음과 같은 직관적인 설명:

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

추천 튜토리얼: "WeChat 공식 계정"

위 내용은 프록시는 작은 프로그램의 비동기 호출을 캡슐화합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제