最近在基于chrome开发一个用于收集和整理 信息(知识)的插件,名称叫Memoreasy。 一贯以来我都是用自己写的AppSiteJS框架在写web前台的功能,很少去涉及到异步编程,一般来说也就只是在XMLRequest( Ajax )的时候会用。
而在开发chrome插件的时候,几乎所有的api都是异步API,在第一时间的时候还是让我有些不适应。
但是很多时候理解一个技术或者说模式,最重要的并不是强迫自己去理解很多别人的说明、解释或者说代码。最关键的是需要以一个好的思路领会到这个概念的精髓。
我们先说同步编程,大家肯定不陌生,最初学习编程的时候我们都是使用同步编程,同步编程就好比工厂的流水线。
我们在进行同步编程的时候 每一个后续的步骤都依赖于前一步的计算或结果(返回值),如果其中一个过程出现问题,那后续的工作也无法继续了。 换言之,我进行后续工作的时候肯定已经获得了前一步的结果了。 从我们的思维习惯上来讲,这个过程的可控性是很好的。
代码语言:javascript复制// 一个简单同步编程的代码说明
var a = "hello", b = 10;
var u = getUseid();
if( u ){
var obj = { text: a, number: b, user: u };
console.log(obj);
}else{
console.log( 'user not found' );
}
function getUserid(){
return localStorage.getItem('userid');
}
在这段程序中,无论是否找到userid 控制流程实际上还是在当前这段代码中的。 这相当于开发者是公司的老板,让员工去完成一些任务,且无论完成的如何,都需要向老板汇报,然后老板再向员工发布下一步的任务。 这就是我们常识中的“集权"。 我们喜欢同步编程,也就是喜欢他的掌控度。
但是同步也会遇到问题。譬如说,从网络中请求数据(Ajax)时我们无法掌控对方的后续结果。 这就相当于我们在网上下单购物,快递走哪里,什么时间到什么位置,会不会被堵车,会不会在仓库里被堆积,被哪个快递员投递等等。 这种情况我称之为不可控编程,在这个时候,我们不可能一直在手机前面全程跟踪一直到收到商品,我们一般放下手机该吃吃该喝喝,等待快递员的电话。 其实我们也早已习惯了“放权”,只是在编程中,我们需要对那些习惯做一些适应。 来看一段示例代码:
代码语言:javascript复制// 购物异步编程 仅供参考 完全不严谨!
function 购物( 订单 ){
return Promise( 付款之后, 没给钱 ){
给钱( 订单.价格 ).then( function(){
付款之后( 订单 )
}).catch(function(){
没给钱()
})
}
}
function 发快递( 订单 ){
var 包裹 = 商家打包( 订单 ); // 打包好了才能发包裹,所以需要同步
return Promise( 到货, 丢了 ){
发货().then( function( 包裹 ){
到货( 包裹 )
}).catch(function( ){
丢了()
})
}
}
function 到货( 包裹 ){
return Promise( 在家, 不在家 ){
打电话( 包裹.收件人 ).then( function(){
在家( 包裹 ); // 送货上门
}).catch(function(){
放到快递柜( 包裹 )
})
}
}
这里我们定义了多个购物相关的异步方法,而我们在调用的时候就很简单了
代码语言:javascript复制购物( 订单 ).then( 发快递 ).catch( 弹窗提示 );
是不是感觉打开了新世界,因为发快递之后的事情我都不用管了,放权也是很爽的。