在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在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 的对比用法 对比!!!的更多相关文章

  1. node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

    最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...

  2. js中回调函数(callback)的一些理解

    前言 我个人在学习Node.js相关知识时遇到了回调函数这个概念,虽然之前已经在c,c++等编程语言中用到过它,但还一直未对其机制有深入了解,这次就来好好谈一下它. 概念理解 百度对它的解释是回调函数 ...

  3. JS中回调函数的写法

    <!DOCTYPE HTML> <html><head>  <meta charset="GBK" /><title>回 ...

  4. [js]js中回调函数

    //回调函数: 把一个函数当参数传给另个函数 /* function f1() { console.log('f1'); } function f2(f) { f(); console.log(1); ...

  5. js中回调函数写法

    第一种方式 function studyEnglish(who){ document.write(who+"学习英语</br>"); } function study( ...

  6. JS中回调函数的简单用法

    a能拿b,b能拿到c,c能拿到d,实现a拿到d的东西. function a() { b(function (data) { console.log(data); }); } function b(c ...

  7. JS中回调函数的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...

  9. callback vs async.js vs promise vs async / await

    需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...

随机推荐

  1. t100 debug常用指令

    1.     r.d 程式代號 Find (Ctrl+F) => Find Next(F3). 設中斷點(Toggle):Double Click => Run/Continue the ...

  2. Python-记事本

    1.文本颜色 格式:\[显示方式;前景色;背景色m要打印的字符串\[0m 2.format 格式 print('{}的三次方为{:*^20}'.format(a,pow(a, 3))) print(& ...

  3. C# vb .net实现锐化效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的锐化效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  4. c# js 时间

    DateTime GetTime(double timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new Dat ...

  5. python入门基础思维导图

  6. 简单后台管理系统框架--HTML练手项目2【Frameset】

    [本文为原创,转载请注明出处] 技术[HTML]   布局[Frameset] 无步骤 <!DOCTYPE html> <html lang="en"> & ...

  7. 如何选择优秀的APS系统供应商?问自己这几个问题!

    高级的计划和排程和生产排程软件的好处是巨大的.然而,生产排程软件不是商品,尚不能保证您选择的任何高级的计划和排程软件能满足您的所有需求. 那么,我们来谈谈如何选择适合你的公司最好的生产排程软件.这需要 ...

  8. 多线程:Monitor、synchronized、volatile

    Moniter的实现原理 再有人问你synchronized是什么,就把这篇文章发给他 深入理解Java中的volatile关键字 既生synchronized,何生volatile

  9. synchronized底层实现原理

          基于进入和退出管程(Monitor)对象实现,无论显式(Monitorenter Monitorexit)还是隐式都是如此.同步方法并不是由monitorenter和monitorexit ...

  10. golang并发基础

    1. go协程(go routine) go原生支持并发:goroutine和channel. go协程是与其他函数或方法一起并发运行的函数和方法.go协程可以看作是轻量级线程. 调用函数或者方法时, ...