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

hzc
풀어 주다: 2020-06-05 10:00:09
앞으로
2971명이 탐색했습니다.

저번에 쓴 글:

저번에 읽지 않은 분들을 위해 여기 있습니다: 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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿