关于异步编程进一步研究
从回调地狱说起,JavaScript异步编程__“回调地狱”的一些解决方案
事件发布/监听模式
借鉴这种思想,一方面,我们可以监听某一事件,当事件发生时,进行相应回调操作;另一方面,当某些操作完成后,通过发布事件触发回调。这样就可以将原本捆绑在一起的代码解耦。
const events = require('events');
const eventEmitter = new events.EventEmitter();
eventEmitter.on('db', (err, kw) => {
db.find(`select * from sample where kw = ${kw}`, (err, res) => {
eventEmitter('get', res.length);
});
});
eventEmitter.on('get', (err, count) => {
get(`/sampleget?count=${count}`, data => {
console.log(data);
});
});
fs.readFile('./sample.txt', 'utf-8', (err, content) => {
let keyword = content.substring(0, 5);
eventEmitter. emit('db', keyword);
});
使用这种模式的实现需要一个事件发布/监听的库。上面代码中使用node原生的events模块,当然你可以使用任何你喜欢的库。(比如这次项目,大神就使用了自定义的一个vue实例进行监听,如下)
export const SDKObserver = new Vue();
// 注册函数,给原生调用
bridge.registerHandler('uploadPicSuccessFuc', function(data) {
callback(data);
SDKObserver.$emit('uploadPicSuccessFuc', data);
});
}
然后在页面组件里进行监听,就能捕获这个事件,并且能够获取到data
为回调函数
SDKObserver.$on("uploadVideoSucessFuc", obj =>
{
}
这样在公共组件抛出事件,页面组件监听并捕获,调用回调函数的做法,有利于解耦,增加可读性和复用性。并且在SDKObserver
这个vue示例下的箭头函数,this
的指向必定是vue示例,就可以调用vue本身的api。
海通社区的打包改造
关于如何让海通社区项目支持es6,林宇大神提出了一个方案,
可以考虑在js目录下使用es6书写好js代码,然后通过gulp打包为项目中原来目录下的.controller.js
,就能正常的继续接下来的步骤了。缺点就是会每多一个js文件就会多一个es6文件。
至于为什么要这么麻烦的改,是因为原来打包的插件和代码都不支持es6,只能通过这种折中的办法来进行解决。
编码过程中遇到js的类型转换问题
js是个弱类型语言动态类语言,所以碰到需要类型转换的时候容易遇到坑,最常见的就是if()
里的类型转换,比较点典型的坑是当()里的值为0是,也会返回false.