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 ...
随机推荐
- CLRS10.1-7练习 - 用双队列实现栈
算法中心思想: 始终向非空队列进行入队操作 初始化时两个队列都为空,我们对q1进行入队操作 入栈: 只需执行其中一个队列入队操作即可, 具体操作哪一个队列,用一个标记变量标记 出栈流程图 代码实现 p ...
- Golang_小程序学golang
1 前置条件 Golang基本情况自行baidu/google 1.1 环境与工具 IDE:liteide (windows ).mingw-w64 (gcc) DB:SQL Server 2008 ...
- 使用NODEJS实现JSONP的实例
JSONP与JSON只有一字之差,我们在使用Jquery的Ajax调用的时候也是使用相同的方法来调用,两者的区别几乎只在于使用的dataType这个属性的不同.但是实际上JSON和JSONP是完全不同 ...
- P2801 教主的魔法 (线段树)
题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...
- webpack集成vue单文件模式的很多坑(研究了1个星期)
1.一开始不知道局部安装webpack后,如何调用webpack. 后来看说明文档(webpack中文网)才知道,有个npx可以启动本地安装的webpack. 我估计:全局安装webpack,全局的w ...
- day 09 预科
目录 函数 定义函数 函数定义的三种形式 空函数 有参函数(有参数()的函数) 无参函数 函数的返回值 函数的参数 形参 位置形参 实参 位置实参 关键字实参 函数 def twoSum(nums,t ...
- Node: 开发命令行程序英文版 (Create Your Own CLI)
CLI, as an abbreviation of Command-line Interface, can receive user's input and give an immediate re ...
- python smtp登陆邮箱失败
>>> server.connect('smtp.163.com') (220, b'163.com Anti-spam GT for Coremail System (163com ...
- jmeter bodydata参数传递
参见:接口测试, jmeter bodydata 传送的参数,在请求中显示为空 新增http header信息头:
- Linux 常见 RAID 及软 RAID 创建
RAID可以大幅度的提高磁盘性能,以及可靠性,这么好的技术怎么能不掌握呢!此篇介绍一些常见RAID,及其在Linux上的软RAID创建方法. mdadm 创建软RAID mdadm -C -v /de ...