先看题:
function a() {
console.log('a')
}
async function asyncFn() {
console.log('asyncFn')
await 'hello'
a();
console.log('asyncFn end')
}
asyncFn()
console.log('end')
Promise定义:Promise 是 JavaScript 中处理异步操作的标准化解决方案,本质上是一个表示异步操作最终完成或失败的对象
- 状态机制:
- pending(未决/挂起状态):初始状态
- fulfilled(已完成):操作成功完成
- rejected(已拒绝):操作失败13
async/await 是基于 Promise 的语法扩展,使异步代码的编写方式更像同步代码
async 是异步的意思,await 则可以理解为等待
放到一起可以理解async就是用来声明一个异步方法,而 await 是用来等待异步方法执行
正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。
不管await后面跟着的是什么,await都会阻塞后面的代码
所以上面的代码输出顺序就是:
再来看一个promise的例子:
// 使用while循环,模拟延迟
function sleep(delay) {
let start = new Date().getTime();
while (new Date().getTime() - start < delay) {
continue;
}
}
// 创建一个 Promise 对象
const promise = new Promise(function (resolve, reject) {
console.log('Promise start...');
// 模拟延迟2s
sleep(2000)
resolve('res')
console.log('Promise end...');
}).then(res => {
console.log('then')
});
console.log('end', promise);
创建Promise实例时,传入的参数(函数)是立即执行的同步代码
new Promise(function(){})//function(){}是同步执行的,
所以Promise start和 Promise end会先后打印,end随后输出,then方法里的会在主线程都执行完后在执行,最后输出then。
在里面调用resolve或者reject后,promise会执行then或者catch这两个方法是异步的。 调用后会改变promise实例的状态:
resolve ==>fulfilled,调用then方法;
reject ==> rejected,调用catch方法;
所以上面的代码输出顺序就是: