微信小程序中使用bluebird
发布于 2 年前 作者 xinshangshangxin 5496 次浏览 来自 分享

微信小程序中使用bluebird

2017/1/13更新说明, bluebird.join无法使用, 原因为小程序更新Function实现 更新内容

探究过程

不想看探究过程的, 结论在最后.
因为 bluebird 会抛出 Unhandled rejection Error, 以及强大的方法, 如 map, props 等, 使用 es6-promise 无法满足我, 故探究如何引入 bluebird

  • 直接引入
    npm install bluebird 之后, 直接使用
const Promise = require('../node_modules/bluebird/js/release/bluebird.js');

提示 module "node_modules/bluebird/js/release/bluebird.js" is not defined;

  • 将安装后的文件夹复制
    node_modules/bluebird/js/release 存在 browser 和 release 2 个文件夹, 由于微信小程序并不运行在浏览器中, 故不能引入browser; 将 release 文件夹拷贝至 utils 文件夹后引入. 在微信开发者工具中虽然报了 8个 can not create Function,但是依然可以使用.

2017/1/13更新, 8个warn已经转换为error, 原因为 Promise.join需要使用 new Function, 但是小程序Function 表现不一致导致, 最终决定去除 bluebird/js/release/join.js, 即 bluebird.jooin不工作

mina2.png

  • 真机环境测试
    在真机环境中使用时(我Android4.4), 却出现了 cannot create property 'createElement' of undefined

mina1.png

  • 搜索 createElement 寻找线索
    在 搜索node_modules/bluebird/js/release/文件夹后发现, 在 schedule.js 中存在 createElement;

mina3.png

分析代码后发现在真机中, 程序进入了以下内容

mina4.png

  • 解决方案
    修改 schedule.js, 让其直接使用 setTimeout.

结论

1 . npm i bluebird 2 . 将 node_modules/bluebird/js/release 文件夹拷贝出来, 比如拷贝到 utils 目录下 3 . 将 utils/bluebird/js/release/schedule.js 中的内容替换为

```js
module.exports = function (fn) {
  setTimeout(fn, 0);
};
```

4 . require 后使用

const Promise = require('./bluebird/js/release/bluebird.js');

5 . 如果每次修改嫌麻烦, 可以使用脚本控制
也可以尝试 我自用的微信骨架 https://github.com/xinshangshangxin/MINA-seed, 注入了 bluebird, promisify了wx.xxx接口, 修改了 vConsole时不输出function和error

参考文档


文章若有纰漏请大家补充指正,谢谢~~ http://blog.xinshangshangxin.com SHANG殇

6 回复

2017/1/13更新说明, bluebird.join无法使用, 原因为小程序更新Function实现 更新内容

移动时代的IE

bluebird 过于复杂了吧,要用 promise 把 https://www.npmjs.com/package/es6-promise-polyfill 稍微调整下就能用了

是什么原因造成的,是因为鹅厂的x5 跟es5规范有冲突吗?

写微信小程序 就不要想着用 各种库了 . 能自己实现的就自己实现.
需要实用到 其他 库的辅助方法 建议单独copy 出来 …
小程序大小 最大只能是 1mb … 意味着空间太宝贵了 . 不要把空间浪费在这种地方…
空间需要留给业务

回到顶部