zoukankan      html  css  js  c++  java
  • nodejs 事件循环 试题思考

    这篇文章没有做出很好的解释, 我只是想记录一下关于事件循环的示例(可以思考思考):

    开始之前我们先看一下 Promise

    语法:

    new Promise(executor)
    

    executor 中的代码的是同步执行的

    详见: Promise() 构造器


    示例一:

    给出两段代码思考打印顺序:

    ;(async () => {
      await console.log(1)
      await console.log(2)
      await console.log(3)
      await console.log(4)
    })()
    
    ;(async () => {
      await console.log('a')
      await console.log('b')
      await console.log('c')
      await console.log('d')
    })()
    

    或者这样:

    new Promise((resolve) => {
      resolve()
    }).then(() => {
      console.log(1)
    }).then(() => {
      console.log(2)
    }).then(() => {
      console.log(3)
    }).then(() => {
      console.log(4)
    })
    
    new Promise((resolve) => {
      resolve()
    }).then(() => {
      console.log('a')
    }).then(() => {
      console.log('b')
    }).then(() => {
      console.log('c')
    }).then(() => {
      console.log('d')
    })
    

    打印结果:

    1
    a
    2
    b
    3
    c
    4
    d
    

    示例二:

    再来一个 node 中文网 的例子:

    const bar = () => console.log('bar')
    const baz = () => console.log('baz')
    const foo = () => {
      console.log('foo')
      setTimeout(bar, 0)
      new Promise((resolve, reject) => {
        // 这个函数里面的代码是同步执行的
        resolve('应该在 baz 之后、bar 之前')
        console.log('foo 之后')
      }).then(resolve => console.log(resolve))
      baz()
    }
    
    foo()
    

    打印结果:

    foo
    foo 之后
    baz
    应该在 baz 之后、bar 之前
    bar
    

    转到 node中文网 查看事件循环教程 传送门

    总结

    node.js 事件循环 重要摘取

    ES6 作业队列
    ECMAScript 2015 引入了作业队列的概念,Promise 使用了该队列(也在 ES6/ES2015 中引入)。 这种方式会尽快地执行异步函数的结果,而不是放在调用堆栈的末尾。
    
    在当前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。
    
    有个游乐园中过山车的比喻很好:消息队列将你排在队列的后面(在所有其他人的后面),你不得不等待你的回合,而工作队列则是快速通道票,这样你就可以在完成上一次乘车后立即乘坐另一趟车。
    
    这是 Promise(以及基于 promise 构建的 async/await)与通过 setTimeout() 或其他平台 API 的普通的旧异步函数之间的巨大区别
    

    文献:

    MDN 使用 Promise

  • 相关阅读:
    枚举类
    泛型数组列表
    方法参数
    给一个数字和列表,判断列表中是否存在两个元素之和等于这个数字,并好之两个数的坐标
    selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable报错
    python-selenium提供的execute_script调用js操作
    xlrd读取excel数据封装
    0531-练习题 os.system
    0528 文件操作习题
    05/17
  • 原文地址:https://www.cnblogs.com/taohuaya/p/14679945.html
Copyright © 2011-2022 走看看