Heim > Artikel > WeChat-Applet > Eine kurze Analyse, wie die Login-Funktion in Miniprogrammen implementiert wird
Wie implementiert man die Login-Funktion im Miniprogramm? In diesem Artikel erfahren Sie, wie Sie das Mini-Programm-Login richtig öffnen. Ich hoffe, er hilft Ihnen weiter!
Mini-Programm-Netzwerkkomponente
https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html
RequestTask-Beschreibung
Methode | Beschreibung |
---|---|
RequestTask.abort() | Abbrechen der Anforderungsaufgabe. |
RequestTask.onHeadersReceived(Funktionsrückruf) | HTTP-Antwort-Header-Ereignisse abhören. tritt früher ein als das Anforderungsabschlussereignis. |
RequestTask.offHeadersReceived(Funktionsrückruf) | Abbrechen der Überwachung auf HTTP-Response-Header-Ereignisse. |
RequestTask.onChunkReceived(function callback) | Hören Sie sich das Transfer-Encoding Chunk Received-Ereignis an. Wird ausgelöst, wenn ein neuer Block empfangen wird. |
RequestTask.offChunkReceived(Funktionsrückruf) | Abbrechen des Abhörens des Transfer-Encoding Chunk Received-Ereignisses. |
wx.request(Object object) attribute
Hier werden nur die am häufigsten verwendeten Attribute aufgeführt. Alle Attribute finden Sie unter dem Link.
Eigenschaft | Typ | Standardwert | Erforderlich | Beschreibung |
---|---|---|---|---|
URL | Zeichenfolge | Ja | Schnittstellenadresse des Entwicklerservers | |
Daten | Zeichenfolge /object/ArrayBuffer | Nein | Angeforderte Parameter | |
header | Object | Nein | Legen Sie den angeforderten Header fest. Der Referrer kann nicht im Header festgelegt werden. content-type 默认为 application/json
|
|
Timeout | Nummer | Nein | Timeout in Millisekunden | |
Methode | String | GET | Nein | HTTP-Anfrage Methode |
Erfolg | Funktion |
|
Nein | Die Rückruffunktion für einen erfolgreichen Schnittstellenaufruf. |
fehlgeschlagene Funktion. |
Nein. |
Die Rückruffunktion für einen fehlgeschlagenen Schnittstellenaufruf | ||
Die Rückruffunktion am Ende des Schnittstellenaufrufs (wird unabhängig davon ausgeführt, ob der Aufruf erfolgreich ist oder fehlschlägt), auch wenn es sich um eine abgebrochene Anfrage handelt! |
alle haben die gleiche Ergebnisverarbeitungsmethode: Sie alle haben drei Rückrufattribute: Erfolg, Fehler und Abschluss.
Einführung in das errMsg-Objekt in verschiedenen Situationen der Schnittstellenausführung.
errMsg-Objekt
{errMsg:"request:ok"...} | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
abort | |||||||||||||||||
Methodenname | Beschreibung |
---|---|
Promise.prototype.then | Die Methode gibt ein neues Promise-Objekt zurück, sodass es verkettet geschrieben werden kann. Dieses Design ermöglicht das einfache Umschreiben verschachtelter asynchroner Vorgänge, von der „horizontalen Entwicklung“ von Rückruffunktionen bis zur „Abwärtsentwicklung“. |
Promise.prototype.catch | ist ein Alias von Promise.prototype.then (null, Ablehnung) und wird verwendet, um die Rückruffunktion anzugeben, wenn ein Fehler auftritt. Fehler bei Promise-Objekten haben einen „Blasen“-Charakter und werden rückwärts weitergegeben, bis sie abgefangen werden. Das heißt, der Fehler wird immer von der nächsten Catch-Anweisung abgefangen. Die Methode |
Promise.prototype.finally | gibt ein Promise Promise 。在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在Promise 是否成功完成后都需要执行的代码提供了一种方式。 |
Promise.all | 这避免了同样的语句需要在then() 和catch() 中各写一次的情况。Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。Promise.all 方法接受一个数组作为参数,var p = Promise.all([p1,p2,p3]); p1、p2、p3 都是 Promise 对象的实例。(Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。)p 的状态由 p1、p2、p3 决定,分成两种情况。 (1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。 (2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。 |
Promise.race | Promise.race 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。var p = Promise.race([p1,p2,p3]); 上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的返回值。 |
Promise.any | 接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。所有子实例都处于rejected状态,总的promise才处于rejected状态。 |
Promise.allSettled | 返回一个在所有给定的promise都已经fulfilled 或rejected 后的promise,并带有一个对象数组,每个对象表示对应的promise结果。相比之下,Promise.all() 更适合彼此相互依赖或者在其中任何一个reject zurück. Am Ende des Versprechens wird die angegebene Rückruffunktion ausgeführt, unabhängig davon, ob das Ergebnis erfüllt oder abgelehnt wird. Dies bietet eine Möglichkeit für Code, der ausgeführt werden muss, unabhängig davon, ob das Promise erfolgreich abgeschlossen wird oder nicht. |
then()
🎜 und 🎜catch()
🎜 geschrieben werden muss. Die Promise.all-Methode wird verwendet, um mehrere Promise-Instanzen in eine neue Promise-Instanz zu packen. Die Promise.all-Methode akzeptiert ein Array als Parameter, var p = Promise.all([p1,p2,p3]);
p1, p2, p3 sind alle Instanzen des Promise-Objekts. (Die Parameter der Promise.all-Methode müssen keine Arrays sein, sie müssen jedoch über eine Iteratorschnittstelle verfügen und jedes zurückgegebene Mitglied ist eine Promise-Instanz.) Der Zustand von p wird durch p1, p2 und p3 bestimmt und ist in zwei Situationen unterteilt. (1) Erst wenn der Status von p1, p2 und p3 erfüllt ist, wird der Status von p erfüllt. Zu diesem Zeitpunkt bilden die Rückgabewerte von p1, p2 und p3 ein Array und werden an übergeben Callback-Funktion von p. (2) Solange einer von p1, p2 und p3 abgelehnt wird, wird der Status von p abgelehnt. Zu diesem Zeitpunkt wird der Rückgabewert der ersten abgelehnten Instanz an die Rückruffunktion von p übergeben. 🎜🎜🎜🎜 Promise.race🎜🎜🎜Die Promise.race-Methode verpackt auch mehrere Promise-Instanzen in eine neue Promise-Instanz. var p = Promise.race([p1,p2,p3]);
Solange im obigen Code eine Instanz von p1, p2 und p3 zuerst den Zustand ändert, ändert sich der Zustand von p entsprechend ändern. Der Rückgabewert der Promise-Instanz, die sich zuerst geändert hat, wird an den Rückgabewert von p übergeben. 🎜🎜🎜🎜 Promise.any🎜🎜🎜 empfängt ein iterierbares Promise-Objekt, und solange eines der Versprechen erfolgreich ist, wird das erfolgreiche Versprechen zurückgegeben. Alle Unterinstanzen befinden sich im Status „Abgelehnt“ und das gesamte Versprechen befindet sich im Status „Abgelehnt“. 🎜🎜🎜🎜 Promise.allSettled🎜🎜🎜Gibt ein Versprechen zurück, nachdem alle gegebenen Versprechen erfüllt
oder abgelehnt
wurden, mit einem Array von Objekten, wobei jedes Objekt das entsprechende Ergebnis des Versprechens darstellt. Im Gegensatz dazu eignet sich Promise.all()
besser für Abhängigkeiten voneinander oder endet sofort, wenn einer von ihnen ablehnt
. 🎜🎜🎜🎜小程序API接口Promise化并且把需要登录的调用接口模块化
1、安装插件。请先查看npm支持文档。
npm install --save miniprogram-api-promise
2、在微信开发者工具右方详情中勾选使用npm模块,并在菜单栏工具中点击构建npm。
3、初始化代码。
// app.js import {promisifyAll} from 'miniprogram-api-promise' import login from "../lib/login"; const wxp ={} promisifyAll(wx,wxp) // 需要token的请求统一处理登录和设置header,并且处理错误信息 wxp.requestNeedLogin = async function (args) { let token = wx.getStorageSync("token"); if (!token) { token = await loginWithPromise(); } if (!args.header) args.header = {}; args.header["Authorization"] = `Bearer ${token}`; return wxp.request(args).catch(console.error); }; // app.js App({ wxp:wxp, });
4、改写login.js代码
// lib/login.js function login() { return new Promise((resolve, reject) => { // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认 // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗 wx.getUserProfile({ desc: "用于完善会员资料", // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写 success:async (res0) => { let { userInfo, encryptedData, iv } = res0; const app = getApp(); try { app.wxp.checkSession(); } catch (err) { reject(err); } let token = wx.getStorageSync("token"); if (!token) { let res1 = await app.wxp.login().catch(err => reject(err)); let code = res1.code; let res = await app.wxp.request({ url: "http://localhost:3000/user/weixin-login", method: "POST", header: { "content-type": "application/json", }, data: { code, userInfo, encryptedData, iv, } }).catch(err => reject(err)); token = res.data.data.authorizationToken; wx.setStorageSync("token", token); app.globalData.token = token; wx.showToast({ title: "登录成功了", }); resolve(token); } }, }); }) } export default login;
5、调用代码
<view class="container page-head"> <text class="page-section__title">需要登录的请求调用</text> <view class="btn-area"> <button bindtap="request1" type="primary">请求1</button> <button bindtap="request2" type="primary">请求2</button> </view> </view>
// pages/index.js Page({ /** * 页面的初始数据 */ data: {}, request1() { getApp().wxp.requestNeedLogin({ url: "http://localhost:3000/user/home?name=andying", }).then(console.log) }, request2() { getApp().wxp.requestNeedLogin({ url: "http://localhost:3000/user/home?name=eva", }).then(console.log) }, });
【相关学习推荐:小程序开发教程】
Das obige ist der detaillierte Inhalt vonEine kurze Analyse, wie die Login-Funktion in Miniprogrammen implementiert wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!