面试官:Promise,async和await是什么?

54 阅读2分钟

先看题:

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 中处理异步操作的标准化解决方案,本质上是一个表示异步操作最终完成或失败的对象‌

  1. 状态机制‌:
    • pending‌(未决/挂起状态):初始状态
    • fulfilled‌(已完成):操作成功完成
    • rejected‌(已拒绝):操作失败‌13

async/await 是基于 Promise 的语法扩展,使异步代码的编写方式更像同步代码‌

async 是异步的意思,await 则可以理解为等待

放到一起可以理解async就是用来声明一个异步方法,而 await 是用来等待异步方法执行 正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。

不管await后面跟着的是什么,await都会阻塞后面的代码

所以上面的代码输出顺序就是:

image.png

再来看一个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方法;

所以上面的代码输出顺序就是:

image.png