저번에 쓴 글:
저번에 읽지 않은 분들을 위해 여기 있습니다: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!