异步是javascript的精髓
最近做了一个智能家居的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到了吗?
下面就是一个简单的异步调用了:
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();
作者:ghostwu, 出处:http://www.cnblogs.com/ghostwu
博客大多数文章均属原创,欢迎转载,且在文章页面明显位置给出原文连接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架