收藏
评论

小程序使用async/await 来处理异步

小程序使用async/await 来处理异步

regeneratorRuntime    

https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js


详细看代码片段

https://developers.weixin.qq.com/s/FlIPCOmw7P3c



//引入编译模块

const regeneratorRuntime =require("../libs/regeneratorRuntime.js")

 

const promisify = require('../libs/promisify.js');

//微信 API,转成返回 Promise 的接口 云开发API的有Promise 风格 不需要再转了

const getUserInfo= promisify(wx.getUserInfo);

const login = promisify(wx.login);

wx.cloud.init();

 

Page({

data: {

 

},

onLoad: async function () {

 

console.log(this)

 

const user = await getUserInfo();

console.log("onLoad user",user)

const code = await login();

console.log("onLoad code",code);

 

const res = await wx.cloud.database().collection('todos').where({

_openid: 'xxx' 

}).get();

console.log("onLoad res", res)

},

onShow: async function(){

const user = await getUserInfo();

console.log("onshow", user)

 

}


})

 






最后一次编辑于  2018-11-10  (未经腾讯允许,不得转载)
赞 8
收藏

10 个评论

  • 土豆豆
    土豆豆
    2018-11-13

    我赞的我赞的

    2018-11-13
    赞同 2
    回复
  • 胡玮文
    胡玮文
    02-23

    你好楼主,在ECMAScript modules中,若在export function中使用await将会导致regeneratorRuntime未定义的问题,原因是生成的代码中require regeneratorRuntime的语句将会被放在export的函数之后。请问可有办法解决?代码:

    import regeneratorRuntime from "./libs/regeneratorRuntime.js";


    export async function test() {

      await new Promise((resolve, reject) =>{

        console.log("hello");

      })

    }

    在另一文件调用该函数报错: thirdScriptError
     sdk uncaught third Error
     Cannot read property 'default' of undefined
     TypeError: Cannot read property 'default' of undefined
        at http://127.0.0.1:23730/appservice/api.js:9:66
        at http://127.0.0.1:23730/appservice/api.js:30:2
        at require (http://127.0.0.1:23730/appservice/__dev__/WAService.js:22:26841)
        at http://127.0.0.1:23730/appservice/__dev__/WAService.js:22:26448
        at http://127.0.0.1:23730/appservice/app.js:5:12
        at require (http://127.0.0.1:23730/appservice/__dev__/WAService.js:22:26841)
        at <anonymous>:1:1
        at HTMLScriptElement.scriptLoaded (http://127.0.0.1:23730/appservice/appservice?t=1550895843471:6969:21)
        at HTMLScriptElement.script.onload (http://127.0.0.1:23730/appservice/appservice?t=1550895843471:6981:20)

    02-23
    赞同
    回复 3
    • 饿的快
      饿的快
      03-25

      您好,我遇到了和您相同的问题,请问您后来是如何解决的呢?

      03-25
      回复
    • 蓓
      05-13

      先定义一个对象 把方法赋值到对象上

      然后再export

      var api

      api.xxx=async function(){

      }


      module.exports = api


      05-13
      回复
    • 蓓
      05-13回复饿的快

      你试试我回复的看看

      05-13
      回复
  • 你那么美
    你那么美
    01-17

    你好,我在工具类中使用async await  报错,代码片段是:https://developers.weixin.qq.com/s/hlbKnumJ7G5H


    01-17
    赞同
    回复
  • jorn
    jorn
    01-07

    怎么实现全局注册,不用每个页面都引用

    01-07
    赞同
    回复 1
    • 半寸灰
      半寸灰
      01-07


      全局引用
       
       
       
       
       
      app.js
       
       
       
       
      //引入模块
       
      const regeneratorRuntime = require("libs/regeneratorRuntime.js")
       
       
       
       
      const promisify = require('libs/promisify.js');
       
      //微信 API,转成返回 Promise 的接口  云开发API的有Promise 风格  不需要再转了
       
      const getUserInfo = promisify(wx.getUserInfo);
       
      const login = promisify(wx.login);
       
      wx.cloud.init( );
       
       
       
       
       
      App({
       
       
       
      regeneratorRuntime,
       
      getUserInfo,
       
      login,
       
      promisify,
       
      onLaunch: function () {
       
       
       
      }
       
      })
       
       
       
       
       
      index.js
       
       
       
       
       
       
       
       
      const app = getApp();
       
      const regeneratorRuntime = app.regeneratorRuntime;
       
       
       
      Page({
       
      data: {
       
       
       
      },
       
      onLoad: async function() {
       
       
       
      console.log(this)
       
       
       
       
      const user = await app.getUserInfo();
       
      console.log("onLoad user", user)
       
      const code = await app.login();
       
      console.log("onLoad code", code);
       
       

       
      console.log("onLoad res", res)
       
      },
       
      onShow: async function( ) {
       
      const user = await app.getUserInfo();
       
      console.log("onshow", user)
       
       
       
      }
       
       
       
       
       
      })


      01-07
      回复
  • 未来
    未来
    01-07

    我赞的我赞的

    01-07
    赞同
    回复
  • 君 ᴸᴵᴺ
    君 ᴸᴵᴺ
    2018-12-12

    楼主,您好!

    我参照了你的写法,但为什么res是undefined?我是用2.4.2基础库


    2018-12-12
    赞同
    回复 2
    • 半寸灰
      半寸灰
      2018-12-12

      把count里面的  success 去掉

      async/await

       是依赖于  success  和 fail 等等回调函数 的 返回值


      你这样相当于重写了success  导致没有返回值  所以自然未定义

      2018-12-12
      回复
    • 君 ᴸᴵᴺ
      君 ᴸᴵᴺ
      2018-12-12回复半寸灰

      这个问题弄了很久,现在解决了,十分感谢!

      2018-12-12
      回复
  • 舍得叔叔
    舍得叔叔
    2018-11-18

    为什么从11.17开始,引入runtime实现await和ansync的方法不能用了?你们有遇到吗?

    2018-11-18
    赞同
    回复 10
    • 半寸灰
      半寸灰
      2018-11-18

      基础库多少  ?

      2018-11-18
      回复
    • 舍得叔叔
      舍得叔叔
      2018-11-18回复半寸灰

      2.4.0

      2018-11-18
      回复
    • 舍得叔叔
      舍得叔叔
      2018-11-18回复半寸灰

      之前使用await没有任何问题,11.17开始就不行了,郁闷啊!

      2018-11-18
      回复
    • 半寸灰
      半寸灰
      2018-11-18回复舍得叔叔

      好的  我看看

      2018-11-18
      回复
    • 半寸灰
      半寸灰
      2018-11-18回复半寸灰

      开发工具测试可以的

      有代码片段什么的么

      2018-11-18
      回复
    查看更多(5)
  • 衬衫
    衬衫
    2018-11-12

    还有。。。如果wx.getUserInfo()     fail的时候如何处理,麻烦楼主告知下~谢谢

    2018-11-12
    赞同
    回复 4
    • 半寸灰
      半寸灰
      2018-11-12

      const user = await getUserInfo()


      这个user会返回错误信息的  自己判断一下就可以了

      2018-11-12
      1
      回复
    • 衬衫
      衬衫
      2018-11-12回复半寸灰

      如果地址不对的话   不用try catch会直接报错   后面的代码就不会执行了    你的意思是包一层try catch吗?

      const req = promisify(wx.request);

       
      const res = await req({
       
          url: 'https://aaa.bbb'
       
      });
       
      if(res){
       
          console.log('ok',res);
       
      else {
       
          console.log('error');
       
      }


      2018-11-12
      回复
    • 半寸灰
      半寸灰
      2018-11-13回复衬衫

      看逻辑  要继续  运行就try  cath

      2018-11-13
      1
      回复
    • 衬衫
      衬衫
      2018-11-13回复半寸灰

      好的  感谢

      2018-11-13
      回复
  • 衬衫
    衬衫
    2018-11-12

    hi 楼主  promisify(wx.request)  这个参数应该怎么传?

    // 这么写报错啊

    promisify(wx.request({

        url: 'asdasdasd'

    }))

    2018-11-12
    赞同
    回复 2
    • 半寸灰
      半寸灰
      2018-11-12

       const  request =promisify(wx.request) 


      const   res= await request({

      url:'',

      data:{}

      })


      console.log(res);

      2018-11-12
      1
      回复
    • 衬衫
      衬衫
      2018-11-12回复半寸灰

      谢谢~

      2018-11-12
      回复
  • 卢霄霄
    卢霄霄
    2018-11-12

    我赞的我赞的

    2018-11-12
    赞同
    回复