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!