返回
由一道 bilibili 面试题看 Promise 异步执行机制
前端
2023-09-09 15:07:14
序言
作为一名技术工作者,我们经常需要处理异步任务,例如发送网络请求、读取文件、处理用户输入等。这些任务通常需要花费一定的时间来完成,因此我们不能立即得到结果。为了解决这个问题,我们可以使用 JavaScript 中的 Promise 对象来处理异步任务。
Promise 是什么?
Promise 是 JavaScript 中处理异步操作的强大工具,它允许我们使用更简洁、更具可读性的方式编写代码。Promise 对象表示一个异步操作的最终完成或失败及其结果值。我们可以通过 Promise 对象来监听异步操作的状态,并在操作完成或失败时执行相应的回调函数。
Promise 的状态
Promise 对象有三种状态:
- pending :表示异步操作正在进行中,尚未完成或失败。
- fulfilled :表示异步操作已成功完成,并带有结果值。
- rejected :表示异步操作已失败,并带有错误信息。
Promise 的用法
Promise 对象有三个方法:
- then() :用于监听 Promise 对象的状态,并在操作完成或失败时执行相应的回调函数。
- catch() :用于监听 Promise 对象的状态,并在操作失败时执行相应的回调函数。
- finally() :无论 Promise 对象的状态如何,都会执行相应的回调函数。
bilibili 面试题
一道 bilibili 面试题如下:
var date = new Date()
console.log(1, new Date() - date)
setTimeout(() => {
console.log(2, new Date() - date)
}, 0)
console.log(3, new Date() - date)
这个代码会输出什么?
答案
这个代码的输出是:
1 0
3 0
2 0
解释
这个代码首先创建一个 Date 对象,然后输出当前时间戳。接下来,使用 setTimeout() 函数设置一个计时器,在 0 毫秒后执行一个回调函数。最后,再次输出当前时间戳。
当代码执行时,首先会输出当前时间戳,然后会执行 setTimeout() 函数。setTimeout() 函数会将回调函数放入事件队列中,然后继续执行后面的代码。此时,会输出第二次当前时间戳。
当事件循环再次执行时,会从事件队列中取出回调函数并执行它。回调函数会输出第三次当前时间戳。
结论
Promise 是 JavaScript 中处理异步操作的强大工具,它允许我们使用更简洁、更具可读性的方式编写代码。本文通过一道 bilibili 面试题来演示 Promise 的工作原理和异步执行机制,让读者对 Promise 有更深入的了解。