美文网首页我爱编程
js代码的异步执行方式

js代码的异步执行方式

作者: lvzhiyi | 来源:发表于2018-05-21 11:22 被阅读0次

由于JavaScript的执行环境是单线程的,导致js代码的两种执行方式:

  • 以js代码的先后顺序执行的顺序型
  • 以事件驱动触发执行的事件型

以js代码的先后顺序执行的顺序型

也就是所谓的同步执行,相对于位置靠前的代码执行完成,才去执行后续的代码

console.log('1');
console.log('2');

以事件驱动触发执行的事件型

function c(){
    console.log('3');
}
console.log('1');
onclick = c();
console.log('2');

异步执行:只要不阻断js主线程执行而执行的代码都是异步执行,以上点击事件触发函数c()的执行并不影响后续代码执行;所以所有的事件触发函数都是异步执行,也就是第一种异步执行方式:事件监听

onclick = c();我们探讨异步执行的第二种方式:发布-订阅模式:
首先onclick是js原生事件,那么换成我们自定义的事件,就构成了所谓的发布订阅模式,自定义事件参照自定义事件

  • 订阅Event.on('click',fn)
  • 发布Event.emit('click')

以上我们自定义的事件click的触发fn的执行不影响主线程的执行顺序,所以fn函数代码为异步执行;从事件的发布订阅模式,我们探讨第三种异步执行方式:回调函数

const event = {};
function on(type,callback){
     event.type = callback;
}
function emit(type){
      event.type();
}

以上就是最简单的一个事件的发布订阅,可以看出归根结底就是一个callback的执行,以下是一个简单的异步回调:

       function A(callback){
            console.log("I am A");
              callback();  
            console.log("I am C")
        }
        function B(){
            setTimeout(function(){
                console.log("I am B");
            },1000)
        }
        A(B);

从回调函数我们探讨第四种异步执行方式promise

        class Promisser{
            constructor(callback) {
                this.res = this.res.bind(this);
                this.rej = this.rej.bind(this);
                this.state = {};
                callback(this.res,this.rej)
            }
            res(val){
                this.state.success = val
            }
            rej(err){
                this.state.error = err
            }
            then(resCallback,rejCallback){
                Object.defineProperty(this.state,'success',{
                    get: function () {
                        return this.state
                    },
                    set: function (newValue) {
                        resCallback(newValue);
                    }
                })
                Object.defineProperty(this.state,'error',{
                    get: function () {
                        return this.state
                    },
                    set: function (newValue) {
                        rejCallback(newValue);
                    }
                })
            }
        }

        const test = new Promisser(function(res,rej){
            setTimeout(()=>{
                res('success')
            },1000)
            setTimeout(()=>{
                rej('error')
            },2000)
        })
        test.then((res)=>{
            console.log('111111',res) //111111 success
        },(rej)=>{
            console.log('222222',rej) //222222 error
        })

以上是一个简单的promiss原生模拟实现,可以看出,归根结底也是监听对应状态的变化触发对应callback的执行,只是执行的位置移到了函数外部;

综上所述

js中异步执行的方式:事件监听,事件的发布-订阅,promise对的异步执行原理都是回调函数,也是js异步执行的主要方式;

其他异步执行方式

另外的异步执行方式es6的新式api Generator函数与之对应的语法糖async函数,这里不做讨论。

相关文章

  • js代码的异步执行方式

    由于JavaScript的执行环境是单线程的,导致js代码的两种执行方式: 以js代码的先后顺序执行的顺序型 以事...

  • 浏览器中的事件循环与Node中的事件循环

    浏览器中的事件循环 JS线程读取并执行JS代码 执行JS代码的过程中,指定异步的操作给对应的线程处理 异步线程处理...

  • 初步讲解JS中的callback回调原理

    初步讲解JS中的callback回调原理 JS的异步执行机制 什么是异步执行 为了提高Javascript代码的运...

  • 你不知道的异步

    异步函数 误区:把script代码放到body底部并不是异步执行js代码,仅仅是让页面优先解析然后再解析执行js代...

  • js运行机制

    js是单线程运行。自上而下,然而为了解决代码阻塞的问题,js需要异步处理。先执行同步代码,等有空了,再执行异步 代...

  • JS基础知识5--同步和异步

    题目 一,同步和异步的区别是什么?异步是基于JS单线程的,异步不会阻塞代码的执行,同步会阻塞代码的执行 二,手写p...

  • 2019-08-17

    异步是什么? 异步:不是同步执行的代码就是异步。同步代码就是从上往下执行,因为JS是单线程的原因,所以在一条线上如...

  • javascript的同步异步编程

    js中的同步和异步 同步js是单线程的,浏览器只会分配一个js引擎线程,用来执行js代码,当其执行代码时,js一次...

  • js事件循环

    在js代码中,除了同步代码,就是异步代码,一个js文件是从上往下执行,遇到ajax,点击事件。settimeout...

  • 基础知识1 ajax请求是否是异步

    async 异步 async:false 同步 当执行当前AJAX的时候会停止执行后面的JS代码,直到AJAX执行...

网友评论

    本文标题:js代码的异步执行方式

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