小程序开启ES6转ES5后async函数无法使用的最新解决方案

2,029 阅读1分钟

众所周知在小程序里如果开启了ES6转ES5是没法用 async/await 的,但还是有解决办法的,搜到的解决方案都指向 runtime.js 这个文件。

但是Facebook在19年3月8号更新了runtime.js 的代码,用了 Function 函数,于是小程序里又不能用了,惊不惊喜。。。

解决办法

当然是把 Function 改回去,我已经改好并上传到Github了。

有需要的直接下载即可 点我下载runtime.js (蓝字可点,或者复制下方链接)。

https://github.com/xubaifuCode/regeneratorRuntime/tree/master

事情起因

为了封装request,简易代码如下

new Promise(async (resolve) => {
      const result = await request(options);
      resolve(result);
    });

运行时发现错误(编辑器开启了ES6转ES5)

同一块代码,同一个错误

网上搜,都说是下载regenerator-runtime的库,例如

https://developers.weixin.qq.com/community/develop/doc/000a4ac7c7c108998916efda35b400
https://blog.csdn.net/sinat_33184880/article/details/85533095

但是我引入之后出现了如下错误

在这里插入图片描述

VM9914:1 thirdScriptError 
sdk uncaught third Error  
Function(...) is not a function
TypeError: Function(...) is not a function

错误原因是使用了 Function 函数, 小程序当然是拒绝使用这个不安全的函数的,于是就报错了。

在这里插入图片描述

既然在小程序里是不能使用 Fcnction 函数的,那为什么网上的解决方案都是这个呢?

于是我去GitHub仓库查看runtime.js版本更新记录

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

发现3月8号有一次更新,点进去就发现,新增的代码正是导致小程序报错的罪魁祸首。

更新

新增代码

修复这个问题也是很简单,删掉新增的try-catch语句,同时将var runtime改回var regeneratorRuntime即可。

人家为什么要改成用Function?

在这里插入图片描述

在这里插入图片描述

从上图中可以看到,是为了避免严格模式出错才用的 Function,还是大佬姿势多,学习一个。