最近做了一個智能家居的APP,目前純JS代碼已經4000多行,不包括任何引入的庫。還在不斷升級改造中。。。這個項目到處都是非同步。大多數都是3~4層調用。給我的感覺就是非同步當你習慣了,你會發現很爽。下麵舉個最簡單的例子? 你知道怎麼返回一個非同步調用的值嗎? 也許你會這麼乾 你肯定得不到你想要的20 c ...
最近做了一個智能家居的APP,目前純JS代碼已經4000多行,不包括任何引入的庫。還在不斷升級改造中。。。這個項目到處都是非同步。大多數都是3~4層調用。給我的感覺就是非同步當你習慣了,你會發現很爽。下麵舉個最簡單的例子?
你知道怎麼返回一個非同步調用的值嗎?
也許你會這麼乾
function getValue(){ var a = 10; setTimeout( function(){ a += 10; }, 10 ); return a; }
你肯定得不到你想要的20
function test(){ var res = getValue(); return res; }
console.log( test() ); //結果10
為什麼?
因為settimeout的原因,把a += 10放在隊列中,等所有的同步代碼完成之後,才輪到他執行。所以return的時候,這個a += 10 是沒有執行的,而且你也不知道,非同步到底什麼時候完成? 這個是不確定的,哪怕你設置了10ms,未必是10ms。。。。如果隊列前面有耗時較長的其他任務,10ms還是得不到響應。。。這樣的例子太多了。比如,我最近的項目,控制空調的關和開。。很顯然,這個時間受制於網路和晶元,以及空調的響應。。並不是設置了多長時間,就是那個時間返回。
那不知道他什麼時候,返回,怎麼拿到他的值?
用回調!
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到了嗎?