关于promise疑惑
发布于 9 年前 作者 nqdy666 5618 次预览 最后一次回复是 9 年前 来自 问答
var Promise = require('promise')
var promise = new Promise(function (resolve) {
resolve()
})
promise.then(function () {
console.log(2)
})
var i = 0
while ( i < 1000000000 ) {
i++
}
console.log(1)
以上代码,为什么测试的时候一直输出的1 2,而不会输出2 1呢?
11 回复
then里面的是异步执行的Promises/A+
next tick 后执行的,也就是在运行完 while 后。
@William17 我已经用while延迟很久了,异步的话,也应该先输出2,再输出1把
@yjhjstz 能解释一下next tick,或者有什么文章推荐一下
@nqdy666 你对异步的理解不太正确, 正如规范里说的
then里的, 会在下一个事件循环才被执行, 而你的while,console.log(1)是在当前的事件循环@nqdy666 简单来说 while不是延迟,而是一种阻塞,把cpu都占了,在while执行完成前,其它异步代码都是被阻塞住了,没法执行。
@zhou-yg @William17 @yjhjstz 嗯嗯,稍微明白了,谢谢你们
前面的都说得对,异步的语句都是放进队列,非异步的语句才放进栈,代码只有在栈里才是被“执行”的。
所有同步代码执行完毕,才会执行队列中的异步代码吧
https://www.promisejs.org/implementing/
一个简单的方法, 你只要想着你的代码中同步的代码运行完了才会运行异步就好了