当前位置:网站首页>Wechat applet full stack development practice Chapter 3 Introduction and use of APIs commonly used in wechat applet development -- 3.9 introduction to network interface (IX) extending the request3 met
Wechat applet full stack development practice Chapter 3 Introduction and use of APIs commonly used in wechat applet development -- 3.9 introduction to network interface (IX) extending the request3 met
2022-07-07 07:21:00 【weixin_ forty-two million five hundred and eighty thousand seve】
zero 、 review
In the last lesson, we mainly introduced the observer mode ,
Based on this pattern, a event modular ,
This lesson is about the automatic integration of basic user login ,
Try to wxp One of the modules is extended request3 Such an interface .
One 、 stay wxp Extension implementation in component request3 Interface
3.7 in ,
When we click on manual login ,
A panel slides out at the bottom .
The next function we want to achieve is ,
If we use request3 When calling the interface ,
If you find that the user is not logged in , No token,
Then let's call it out automatically , Let it slide out ,
After sliding out , Then the user clicks the button to log in ,
After logging in , Automatically make the panel disappear ,
Then continue the interface request we just stopped .
This is probably a function we want to achieve
ilb/wxp.js
import {
promisifyAll
} from 'miniprogram-api-promise';
const wxp = {
}
promisifyAll(wx, wxp)
// 3.6 modularization
wxp.request2 = function (args) {
let token = wx.getStorageSync('token');
if (token) {
if (!args.header) args.header = {
}
args.header["Authorization"] = `Bearer ${
token}`
}
return wxp.request(args).catch(err => console.log("err", err))
}
// 3.9
wxp.request3 = function (args) {
let token = wx.getStorageSync('token');
if (!token) {
// No, token
// Return to one promise object
return new Promise((resolve, reject) => {
// 1. Evoke panel
//1.1 Current page object
// Get the current page stack
let pageStack = getCurrentPages();
// The last page of the page stack is our current page
if (pageStack && pageStack.length > 0) {
let currentPage = pageStack[pageStack.length - 1];
// showLoginPanel: This variable unifies all pages
currentPage.setData({
showLoginPanel: true
})
// 2. After the panel slides out , We need to monitor its successful events
getApp().globalEvent.once("loginSuccess", () => {
// Callback function after success
wxp.request2(args).then(res => {
resolve(res)
}, err => {
console.log("err", err)
reject(err)
})
})
} else {
reject("page valid err")
}
})
}
// If there is token Words , go request2
return wxp.request2(args)
}
export default wxp;
pages/api/index.wxml
<view class="page-section">
<text class="page-section__title">3.9 request3</text>
<view class="btn-area">
<button bindtap="testRequest3" type="primary">request3</button>
</view>
</view>
pages/api/index.js
Page({
/** * Initial data of the page */
data: {
showLoginPanel:false
},
// 3.9 request3
async testRequest3(e){
const app = getApp();
// An interface that requires authentication
let res3 = await app.wxp.request2({
url:'http://localhost:3000/user/home'
})
if(res3) console.log("res3",res3);
// Use request3
let res4 = await app.wxp.request3({
url:'http://localhost:3000/user/home'
})
if(res4) console.log("res4",res4);
},
......
})



Two 、 Problems encountered in development
2.1 wx.request the Promise After encapsulation , How to get RequestTask example
Achieve one :
Create a new class ,Request This class , Encapsulates the wx.request Interface .
But this method needs to change the old development mode , It will bring new development burden .
class Request {
constructor(parms) {
...
this.requestTask = null;
}
request(method, url, data) {
const vm = this;
return new Promise((resolve, reject) => {
this.requestTask = wx.request({
...
success(res) {
resolve(res);
},
fail() {
reject({
...});
}
});
});
}
abort() {
if (this.requestTask) {
this.requestTask.abort();
}
}
}
module.exports = Request;
Achieve two :
Is to return the native interface RequestTask Example ,
Mount to our return Promise Example above ,
But this way , It will invade the native code ,
And in our code ,Promise Instances are not constant ,
stay wxp.request3 in ,Promise The example changes .
Realization three :
Although these two methods can achieve the same purpose ,
But it is not the final method we want to adopt ,
Then a better way is to use javascript Object is passed by reference ,
Do something about this parameter .
miniprogram/node_modules/miniprogram-api-promise/src/promise.js:
function _promisify(func) {
if (typeof func !== 'function') return fn
return (args = {
}) =>{
return new Promise((resolve, reject)=> {
let rtnObj = func(
Object.assign(args, {
success: resolve,
fail: reject
})
)
if (args.onReturnObject) args.onReturnObject(rtnObj)
})
}
}
Let's take a look at this code ,
We only need to add a fixed callback attribute to this module ,
We can solve this problem
if (args.onReturnObject) args.onReturnObject(rtnObj)


function _promisify(func) {
if (typeof func !== 'function') return fn
return (args = {
}) =>
new Promise((resolve, reject) => {
// func(
// Object.assign(args, {
// success: resolve,
// fail: reject
// })
// )
let rtnObj = func(
Object.assign(args, {
success: resolve,
fail: reject
})
)
if (args.onReturnObject) args.onReturnObject(rtnObj)
})
}
Tools –npm structure 
<button bindtap="requestHomeApiByReq4" type="primary">test abort</button>
// 3.9 test requestTask
requestHomeApiByReq4(e){
getApp().wxp.request4({
url:'http://localhost:3000/user/home',
onReturnObject(rtn){
rtn.abort();
}
}).catch(err=>{
console.log(err)
})
},
a key :



3、 ... and 、 summary
In this lesson, we mainly expand wxp Modular request3 This method ,
Start learning next class tabbar Components .
边栏推荐
- 栈题目:有效括号的嵌套深度
- Docker compose start redis cluster
- Differences between H5 architecture and native architecture
- Torefs API and toref API
- Sqlmap tutorial (IV) practical skills three: bypass the firewall
- . Net 5 fluentftp connection FTP failure problem: this operation is only allowed using a successfully authenticated context
- Role of virtual machine
- 组件的嵌套和拆分
- From zero to one, I will teach you to build the "clip search by text" search service (2): 5 minutes to realize the prototype
- Reflection (II)
猜你喜欢

Advanced level of C language (high level) pointer

About binary cannot express decimals accurately

Anr principle and Practice

Introduction to abnova's in vitro mRNA transcription workflow and capping method

L'étape avancée du pointeur de langage C (haut de gamme) pour l'enroulement des cocons

Flexible layout (II)

mips uclibc 交叉编译ffmpeg,支持 G711A 编解码

transform-origin属性详解

SQLMAP使用教程(四)实战技巧三之绕过防火墙

AVL树的实现
随机推荐
About binary cannot express decimals accurately
js小练习
Basic process of network transmission using tcp/ip four layer model
Chinese and English instructions prosci LAG-3 recombinant protein
mips uclibc 交叉编译ffmpeg,支持 G711A 编解码
Freeswitch dials extension number source code tracking
Non empty verification of collection in SQL
LC interview question 02.07 Linked list intersection & lc142 Circular linked list II
MIPS uclibc cross compile ffmpeg, support g711a encoding and decoding
【云原生】内存数据库如何发挥内存优势
$parent (get parent component) and $root (get root component)
$refs:组件中获取元素对象或者子组件实例:
抽丝剥茧C语言(高阶)指针进阶练习
toRefs API 与 toRef Api
Composition API 前提
Big coffee gathering | nextarch foundation cloud development meetup is coming
点亮显示屏的几个重要步骤
transform-origin属性详解
Fullgc problem analysis and solution summary
Unity3d learning notes