最近作了一个智能家居的APP,目前纯JS代码已经4000多行,不包括任何引入的库。还在不断升级改造中。。。这个项目处处都是异步。大多数都是3~4层调用。给个人感受就是异步当你习惯了,你会发现很爽。下面举个最简单的例子? 网络
你知道怎么返回一个异步调用的值吗? app
也许你会这么干 异步
function getValue(){ var a = 10; setTimeout( function(){ a += 10; }, 10 ); return a; }
你确定得不到你想要的20this
function test(){ var res = getValue(); return res; }
console.log( test() ); //结果10spa
为何?code
由于settimeout的缘由,把a += 10放在队列中,等全部的同步代码完成以后,才轮到他执行。因此return的时候,这个a += 10 是没有执行的,并且你也不知道,异步到底何时完成? 这个是不肯定的,哪怕你设置了10ms,未必是10ms。。。。若是队列前面有耗时较长的其余任务,10ms仍是得不到响应。。。这样的例子太多了。好比,我最近的项目,控制空调的关和开。。很显然,这个时间受制于网络和芯片,以及空调的响应。。并非设置了多长时间,就是那个时间返回。blog
那不知道他何时,返回,怎么拿到他的值?队列
用回调!get
function getValue2( fn ){ var a = 10; setTimeout( function(){ a += 10; fn && fn( a ); }, 10 ); return a; }
function test2(){ getValue2( function( res ){ console.log( res ); } ); }
test2();同步
你GET到了吗?
下面就是一个简单的异步调用了:
var Q = { a : [], in : function( v ){ if( !/number|function/.test( typeof( v ) ) ) return; this.a.push( v ); return this; }, out : function(){ var me = this; var v = me.a.shift(); if( !v ) return; if( typeof( v ) == 'function' ) { v(); me.out(); return; } setTimeout( function(){ me.out(); }, v ); } } function watch( res ){ var oDiv = document.createElement( "div" ); oDiv.innerHTML = res; // console.log( res ); document.body.appendChild( oDiv ); } Q.in( function(){ watch( "1 <strong style='color:red'>延时3秒 -->输出2</strong>" ); }) .in( 3000 ) .in( function(){ watch( "2 <strong style='color:green'>延时2秒 -->输出2</strong>" ); } ) .in( 2000 ) .in( function(){ watch( "3 <strong style='color:blue'>后面没有了</strong>" ); } ).out();