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 ...
随机推荐
- python递归函数和河内塔问题
关于递归函数: 函数内部调用自身的函数. 以n阶乘为例: f(n) = n ! = 1 x 2 x 3 x 4 x...x(n-1)x(n) = n x (n-1) ! def factorial(n ...
- 记一次奇怪的python多个变量拼接后的字符串丢失事件
在一次脚本运行中出现了多个变量拼接后的值出现丢失情况. a = "hello " b = "ketty" c = a + b + "!" 预 ...
- python 打包前三天日志
日志格式 app-2019-07-24.log app-2019-07-24.1.log 该脚本适合一天之内有多个日志文件 # /usr/bin/python #-*- coding: utf-8 - ...
- HTML5 极简的JS函数
页面初始化 mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括:创建子页面.关闭 ...
- win10下jupyter修改默认路径的办法
查了很多资料,发现都不管用,最后亲测找到一种方法. 实现的方法就是修改快捷方式标签的目标栏,如下图: 后面有一个%USERPROFILE% 将%USERPROFILE%改成你要的路径就可以了 然后应用 ...
- Java自学-Scanner类
使用Scanner读取数据 System.out.println("") 用于向控制台输出数据. 我们还需要从控制台输入数据,所以需要用到Scanner类. 步骤 1 : 使用Sc ...
- kube-controller-manager日志报watch of *v1beta1.Event ended with: The resourceVersion for the provided watch is too old
1.14.2的k8s版本kube-controller-manager日志报watch of *v1beta1.Event ended with: The resourceVersion for th ...
- Implement CGLIB in ABAP
What is cglib?A Byte Code Generation Library which is high level API to generate and transform Java ...
- hadoop2.8 ha 集群搭建
简介: 最近在看hadoop的一些知识,下面搭建一个ha (高可用)的hadoop完整分布式集群: hadoop的单机,伪分布式,分布式安装 hadoop2.8 集群 1 (伪分布式搭建 hadoop ...
- PHP微信商户支付企业付款到零钱功能
一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...