异步是javascript的精髓

作者: 88b61f4ab233 | 来源:发表于2018-10-30 19:03 被阅读9次

最近做了一个智能家居的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(){ //前端全栈交流学习圈:866109386
            var me = this;// 面向1-3年经验前端开发人员
            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();

相关文章

  • 异步是javascript的精髓

    最近做了一个智能家居的APP,目前纯JS代码已经4000多行,不包括任何引入的库。还在不断升级改造中。。。这个项目...

  • ES6 之 Promise

    Promise是JavaScript异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步...

  • JavaScript异步编程好文摘要

    JavaScript之异步编程简述JavaScript异步编程

  • 通读《JavaScript 语言精髓》

    《JavaScript语言精髓》,原文名是《JavaScript:The Good Parts》,the good...

  • AJAX

    AJAX:Asynchronous javascript And XML 异步的javascript和xml 异步...

  • ajax知识点

    概念: “Asynchronous Javascript And XML”(异步Javascript和XML),是...

  • Ajax学习笔记之Http请求

    Asynchronous JavaScript and XML(异步的JavaScript和XML)AJAX 是一...

  • [前端学习]AJAX部分学习笔记,第一天

    AJAX ajax全程是Asynchronous Javascript and Xml(异步Javascript和...

  • AJAX

    什么是ajax Asynchronous JavaScript and XML(异步javascript和xml)...

  • JavaScript之异步概述

    1,异步(什么是异步,异步出现的原因,异步解决的问题,如何实现异步,什么时候需要异步模式。) JavaScript...

网友评论

    本文标题:异步是javascript的精髓

    本文链接:https://www.haomeiwen.com/subject/othntqtx.html