zoukankan      html  css  js  c++  java
  • NodeJs异步的执行过程

    我这里写了一个代码片段,用来模拟一个嵌套的异步过程,下面我总结了下这段代码的执行顺序var fs = require("fs");

    fs.stat('a.txt',callbackOne(err,stat){
        //执行callbackOne回调函数
        if(err){
            fs.readFile("aa.txt",readFileCallbackOne(err,stat){
                //执行readFileCallbackOne回调函数
           })
       }
       //说明1
    })
    fs.stat('b.txt',callbackTwo(err,stat){
       //执行callbackTwo回调函数
        if(err){
            fs.readFile("bb.txt",readFileCallbackTwo(err,stat){
                 //执行readFileCallbackTwo回调函数
           })
       }
       //说明2
    })
    //说明0

      代码自上而下执行,由于异步操作所以代码在执行到两个读取文件函数的时候会先把两个时间放入事件队列中,直接执行到"说明0"的位置:

    此时事件队列中的事件:

    callbackOne

    callbackTwo

          当执行到"说明0"的位置的时候,nodejs此时会去执行callbackOne,callbackOne里面把文件读完后也会有一个回调事件,此时放入事件队列,事件队列中的事件:callbackOne callbackTwo readFileCallbackOne,此时会走到"说明1"的位置,表示callbackOne执行完成:

    此时事件队列中的事件:

    callbackTwo

    readFileCallbackOne

          此时开始进入callbackTwo中执行,在执行callbackTwo的时候回有一个回调readFileCallbackTwo,此时继续放入事件队列中,

    事件队列中的事件:callbackTwo readFileCallbackOne readFileCallbackTwo,此时代码走到"说明2"的位置,表示callbackTwo执行完成:

    此时事件队列中的事件:

    readFileCallbackOne 

    readFileCallbackTow

          然后再去一次执行事件队列中的事件,从而完成整个流程.     



  • 相关阅读:
    27. 为什么线程执行要调用start而不是直接run
    25. ThreadLocal的使用场景
    23. 线程如何退出结束
    20. Java字符串格式化方法
    21. 时间的格式化方法
    19. 用过spring的线程池还是java的线程池?
    17. zookeeper的实现机制,有缓存,如何存储注册服务的
    面试-spring 那些事
    Apache服务器和tomcat服务器有什么区别?
    JNDI 和JDBC的区别
  • 原文地址:https://www.cnblogs.com/yk123/p/7119296.html
Copyright © 2011-2022 走看看