同步异步的问题,是setTimeout类型的问题。
1.
setTimeout(function () {
console.log(1)
}, 0)
new Promise(function (resolve, reject) {
console.log(2)
for (var i = 0; i < 1000; i++) {
i === 999 && resolve()
}
console.log(3)
}).then(function () {
console.log(4)
})
console.log(5)
结果:
Promise函数:这是ES6中新推出的函数,是一个构造函数,它实际上是对回调函数的一种封装。
MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises
在使用 Promise 时,会有以下约定:
- 在 本轮 Javascript event loop(事件循环)运行完成 之前,回调函数是不会被调用的。
- 通过
then()
添加的回调函数总会被调用,即便它是在异步操作完成之后才被添加的函数。 - 通过多次调用
then()
,可以添加多个回调函数,它们会按照插入顺序一个接一个独立执行。
传递到 then()
中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在 JavaScript 事件队列的所有运行时结束了,事件队列被清空之后,才开始执行。
2.
async function async1 () {
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2 () {
console.log('async2')
}
console.log('script start')
setTimeout(function () {
console.log('setTimeout')
}, 0)
async1()
new Promise(function (resolve) {
console.log('promise1')
resolve()
}).then(function () {
console.log('promise2')
})
console.log('script end')
结果:
MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function
async function
用来定义一个返回AsyncFunction
对象的异步函数。异步函数是指通过事件循环异步执行的函数,它会通过一个隐式的Promise
返回其结果。- 异步函数可以包含
await
指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。