了解使用ES6 Promises时的操作顺序

时间:2016-08-13 21:39:50

标签: javascript ecmascript-6 es6-promise

看一下使用Promises的示例JavaScript代码:

const promiseGen = () => {
    return new Promise((resolve, reject) => {
        reject('something')
    })
}

promiseGen().catch(err => console.log(err))
console.log('after promiseGen')

我原本期望输出为:

something
after promiseGen

但相反,它是

after promiseGen
something

有人可以解释为什么会这样吗?由于我首先要创建承诺,然后调用reject,不应该先打印something吗?承诺是否在一个单独的线程上运行,以至于无法保证操作顺序?

2 个答案:

答案 0 :(得分:1)

Promise始终是异步(即使立即解析),因此将始终在同步代码后解析。

答案 1 :(得分:0)

Promises的规范要求即使他们没有做任何异步,他们也应该以异步方式表现一致性。所以这里,promise的then / catch方法将在下一个事件循环检查时调用,这将在调用堆栈变空时发生,只有在执行最后一个console.log()语句后才会变为空。因此结果。