zoukankan      html  css  js  c++  java
  • 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这个值来进行修饰!

  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/teamemory/p/11076141.html
Copyright © 2011-2022 走看看