js中回调函数,promise 以及 async/await 的对比用法 对比!!!
在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的?
方法1:回调函数
首先要定义这个函数,然后才能利用回调函数来调用!
login: function (fn) {
var app = getApp()
wx.login({
success: res => {
let code = res.code;
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
wx.getUserInfo({
success: res => {
console.log(res)
var inviteUid = wx.getStorageSync('inviteUid')
let dataMap = new Map();
dataMap.set('from', 3);
dataMap.set('superiorId', inviteUid);
dataMap.set('code', code);
dataMap.set('encryptedData', res.encryptedData);
dataMap.set('iv', res.iv);
dataMap.set('scene', 6);
app.get_sign(dataMap, function (...reo) {
let [time, version, client, sign] = reo;
wx.request({
url: app.globalData.url + '/api3_1/WxLogin/login',
data: {
time,
version,
client,
sign,
from: 3,
superiorId: inviteUid,
code,
encryptedData: res.encryptedData,
iv: res.iv,
scene: 6
},
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
console.log(res)
var identity_id = res.data.data.identity_id
wx.setStorageSync('identity_id', identity_id)
if (res) {
fn(res)
}
}
})
})
}
})
}
}
})
}
})
},
调用
app.login((res)=>{
})
方法2:es6的 promise
同样,我们先定义一个带有promise的函数
login: function (fn) {
var app = getApp()
return new Promise((resolve, reject) => {
wx.login({
success: res => {
let code = res.code;
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
wx.getUserInfo({
success: res => {
console.log(res)
var inviteUid = wx.getStorageSync('inviteUid')
let dataMap = new Map();
dataMap.set('from', 3);
dataMap.set('superiorId', inviteUid);
dataMap.set('code', code);
dataMap.set('encryptedData', res.encryptedData);
dataMap.set('iv', res.iv);
dataMap.set('scene', 6);
app.get_sign(dataMap, function (...reo) {
let [time, version, client, sign] = reo;
wx.request({
url: app.globalData.url + '/api3_1/WxLogin/login',
data: {
time,
version,
client,
sign,
from: 3,
superiorId: inviteUid,
code,
encryptedData: res.encryptedData,
iv: res.iv,
scene: 6
},
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
console.log(res)
var identity_id = res.data.data.identity_id
wx.setStorageSync('identity_id', identity_id)
if (res) {
resolve(res)
}
}
})
var userInfo = res.userInfo
wx.setStorageSync('userInfo', userInfo)
})
}
})
}
}
})
}
})
})
},
来来来,这么调用,这里主要是最后通过.then来进行回调的写法
app.login().then((res) => {
console.log(res);
})
方法3:es6中async / await
同样,还是先定义函数,这个和方法2其实是一样的定义方法,还是用promise来进行定义一个返回,只是调用这个函数的时候不一样。
login: function (fn) {
var app = getApp()
return new Promise((resolve, reject) => {
wx.login({
success: res => {
let code = res.code;
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
wx.getUserInfo({
success: res => {
console.log(res)
var inviteUid = wx.getStorageSync('inviteUid')
let dataMap = new Map();
dataMap.set('from', 3);
dataMap.set('superiorId', inviteUid);
dataMap.set('code', code);
dataMap.set('encryptedData', res.encryptedData);
dataMap.set('iv', res.iv);
dataMap.set('scene', 6);
app.get_sign(dataMap, function (...reo) {
let [time, version, client, sign] = reo;
wx.request({
url: app.globalData.url + '/api3_1/WxLogin/login',
data: {
time,
version,
client,
sign,
from: 3,
superiorId: inviteUid,
code,
encryptedData: res.encryptedData,
iv: res.iv,
scene: 6
},
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function (res) {
console.log(res)
var identity_id = res.data.data.identity_id
wx.setStorageSync('identity_id', identity_id)
if (res) {
resolve(res)
}
}
})
var userInfo = res.userInfo
wx.setStorageSync('userInfo', userInfo)
})
}
})
}
}
})
}
})
})
},
咱再来进行调用,这个理论上,你要自己在定义一个新的函数,然后才能用async/await ,可以理解为 await 的等一等,然后就能拿到app.login的返回值,这个方法,在多重回调中就能发挥很大的作用。
async onGotUserInfo(e) {
let res = await app.login();
console.log(res);
}
小结:
如果我们只有一次回调,我们可以用回调函数,也可以用promise,然后用.then来获取值。
如果有多次回掉,那么我们推荐用方法3,这个终极的方案来进行获取回调的值。
如何一个函数返回的是promise对象,则调用这个函数即可用.then()来拿到回调的值。
如果一个函数本身返回的是promise对象,那么我们除了用.then()来拿到回调的值,也可以用await 来等一等,然后就能拿到这个回调的值,当然前提是本身外面需要async这个值来进行修饰!
js中回调函数,promise 以及 async/await 的对比用法 对比!!!的更多相关文章
- node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了
最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...
- js中回调函数(callback)的一些理解
前言 我个人在学习Node.js相关知识时遇到了回调函数这个概念,虽然之前已经在c,c++等编程语言中用到过它,但还一直未对其机制有深入了解,这次就来好好谈一下它. 概念理解 百度对它的解释是回调函数 ...
- JS中回调函数的写法
<!DOCTYPE HTML> <html><head> <meta charset="GBK" /><title>回 ...
- [js]js中回调函数
//回调函数: 把一个函数当参数传给另个函数 /* function f1() { console.log('f1'); } function f2(f) { f(); console.log(1); ...
- js中回调函数写法
第一种方式 function studyEnglish(who){ document.write(who+"学习英语</br>"); } function study( ...
- JS中回调函数的简单用法
a能拿b,b能拿到c,c能拿到d,实现a拿到d的东西. function a() { b(function (data) { console.log(data); }); } function b(c ...
- JS中回调函数的使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- node.js异步控制流程 回调,事件,promise和async/await
写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...
- callback vs async.js vs promise vs async / await
需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...
随机推荐
- C语言中,static关键字作用
static修饰变量 1 在块中使用static修饰变量 它具有静态存储持续时间.块范围和无链接. 即作用域只能在块中,无法被块外的程序调用:变量在程序加载时创建,在程序终止时结束. 它只在编译时初始 ...
- kali更新软件源
首先就是修改软件源文件 /etc/apt/sources.list 可以用leafpad打开,在终端中键入: leafpad /etc/apt/sources.list 原码是kali官方的软件源,更 ...
- Codeforces Round #499 (Div. 1)
Codeforces Round #499 (Div. 1) https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm s ...
- react-navigation 的抽屉效果 createDrawerNavigator (DrawerNavigator)
一.前言: react-navigation 3.x 版本中, 使用createDrawerNavigator 替换 原先的DrawerNavigator 方法: 那么,当前createBottom ...
- Linux 7 重置root密码
在运维工作中经常会遇到不知道密码,密码遗忘,密码被他人修改过的情况,使用这种方式扫清你一切烦恼! 1.启动Linux系统,在出现引导界面时,按“e”键,进入内核编辑界面:2.找到有“linux16”的 ...
- 简单计算器设计(WPF)
要求: 文本框居中,用户不能修改运算结果 当用户选择不同的运算类型时 下方GroupBox的标题与所选运算类型相对应 且文本框数字立即清空 单击[计算]按钮时 如果文本框输入的内容非法 结果文本框显示 ...
- C# vb .net实现翻转特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的翻转特效效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- igel udc2 config
igel udc2 config 系统安装盘下载地址 http://www.myigel.biz/?forcedownload /config/bin/igelone_config #!/bin/sh ...
- 单IP、网络、别名管道限速的设置
单IP.网络.别名管道限速的设置 在设备上,控制网络限速最常用的是流量×××中的“限制器”,你可以把它理解为一个管道,20Mit/s的下载管道,那么下载的最大流量就不会超过20Mit/s.流量限制器结 ...
- Java之路---Day03
2019-10-17-21:18:33 方法 定义格式: public static void 方法名称() { 方法体 } 完整格式: 修饰符 返回值类型 方法名称(参数类型 参数名称,... ...