当前位置:网站首页>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 .
边栏推荐
- Le Service MySQL manque dans le service informatique
- Blue Bridge Cup Birthday candles (violence)
- 计算机服务中缺失MySQL服务
- Please ask a question, flick Oracle CDC, read a table without update operation, and repeatedly read the full amount of data every ten seconds
- Lvs+kept (DR mode) learning notes
- Pass parent component to child component: props
- Role of virtual machine
- How can clothing stores make profits?
- js小练习
- Communication between non parent and child components
猜你喜欢
Tujia, muniao, meituan... Home stay summer war will start
LC interview question 02.07 Linked list intersection & lc142 Circular linked list II
Introduction to abnova's in vitro mRNA transcription workflow and capping method
"Xiaodeng in operation and maintenance" meets the compliance requirements of gdpr
记一个并发规则验证实现
MySQL service is missing from computer service
How can brand e-commerce grow against the trend? See the future here!
SQLMAP使用教程(四)实战技巧三之绕过防火墙
RuntimeError: CUDA error: CUBLAS_ STATUS_ ALLOC_ Failed when calling `cublascreate (handle) `problem solving
Composition API 前提
随机推荐
Fullgc problem analysis and solution summary
How can flinksql calculate the difference between a field before and after update when docking with CDC?
Release notes of JMeter version 5.5
readonly 只读
Common function detect_ image/predict
Databinding exception of kotlin
Use of completable future
MIPS uclibc cross compile ffmpeg, support g711a encoding and decoding
計算機服務中缺失MySQL服務
Libcurl returns curlcode description
A slow SQL drags the whole system down
PostgreSQL source code (59) analysis of transaction ID allocation and overflow judgment methods
Blue Bridge Cup Netizen age (violence)
Anr principle and Practice
How do I get the last part of a string- How to get the last part of a string?
关于二进制无法精确表示小数
At the age of 20, I got the ByteDance offer on four sides, and I still can't believe it
SQLMAP使用教程(四)实战技巧三之绕过防火墙
FPGA course: application scenario of jesd204b (dry goods sharing)
【mysqld】Can't create/write to file