zoukankan      html  css  js  c++  java
  • deAsync.js 真正让异步变同步

    卧槽!牛逼!IMBA!这就是我第一次看到这个库的心情。迫不及待的想要分享给大伙儿。

    同步代码

    众所周知,JS 是一门‘单线程’语言,一旦开始,就会从始至终、从上到下的执行完毕,非常的专一。

    console.log(1)
    console.log(2)
    console.log(3)
    
    // 1
    // 2
    // 3
    

    异步代码

    然而,老实人也有变心的一天。回调函数、Promise 让 JS 拥有了异步处理的能力。

    console.log(1)
    Promise.resolve()
      .then(() => console.log(2))
    
    console.log(3)
    
    // 1
    // 3
    // 2
    

    当然,异步依然改变不了它‘单线程’的初心,这一切都是 eventLoop 的功劳。

    有时候突发奇想,如何在不改变代码顺序的情况下,使之输出 1、2、3 呢?首先必然是await,然而await会向上传染,如果别人也使用了这个模块,就糟糕了。

    或者像下面这样?

    let isReturn = false
    console.log(1)
    Promise.resolve()
      .then(() => {
        isReturn = true
        console.log(2)
      })
    
    while(!isReturn) {
    
    }
    
    console.log(3)
    

    好嘛,直接卡死!

    deAsync.js

    var deasync = require('deasync');
    let isReturn = false
    console.log(1)
    Promise.resolve()
      .then(() => {
        isReturn = true
        console.log(2)
      })
    
    while(!isReturn) {
      deasync.runLoopOnce()
    }
    
    console.log(3)
    // 1
    // 2
    // 3
    

    关键就是deasync.runLoopOnce(),它会强制 node 运行一次事件循环。IMBA!

  • 相关阅读:
    2017年第八届蓝桥杯C/C++ C组国赛 —— 第一题:哥德巴赫分解
    Tree Walk Aizu
    Tree Walk Aizu
    Binary Trees Aizu
    有效的括号
    划分整数
    最大子矩阵和
    最大子段和
    最长上升子序列
    合唱队形
  • 原文地址:https://www.cnblogs.com/fayin/p/15232333.html
Copyright © 2011-2022 走看看