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!

原文地址:https://www.cnblogs.com/fayin/p/15232333.html