JS-24 async异步函数、 await关键字;异步函数的执行流程;进程和线程;浏览器的事件循环;宏任务和微任务;Promise面试题
发布人:shili8
发布时间:2024-12-30 04:13
阅读次数:0
**JS-24 async异步函数、 await关键字**
在 JavaScript 中,async/await 是一种用于处理异步操作的语法糖。它使得异步代码看起来像同步代码,这样可以更容易地理解和维护。
### 异步函数的定义异步函数是使用 `async` 关键字定义的函数,它返回一个 Promise 对象。
javascriptasync function myAsyncFunction() { // ... }
### await关键字在异步函数中,`await` 关键字用于等待一个 Promise 对象的结果。它会暂停当前函数的执行直到 Promise 对象 resolve 或 reject。
javascriptasync function myAsyncFunction() { const result = await myPromise(); // 等待myPromise()的结果 return result; }
### 异步函数的执行流程当我们调用一个异步函数时,它会返回一个 Promise 对象。这个 Promise 对象代表了异步操作的结果。
1. 首先,JavaScript 引擎会创建一个新的线程来执行异步函数。
2. 然后,JavaScript 引擎会继续执行当前线程中的代码。
3. 当异步函数完成时,它会返回一个 Promise 对象给 JavaScript 引擎。
4. JavaScript 引擎会将这个 Promise 对象添加到事件循环中。
### 进程和线程在计算机科学中,进程和线程是两个不同的概念:
* **进程**:一个进程是系统资源分配的基本单位。每个进程都有自己的内存空间、程序计数器等。
* **线程**:线程是轻量级进程,它共享同一内存空间和系统资源。
在 JavaScript 中,浏览器使用多线程来执行 JavaScript代码,每个线程代表一个任务。这些线程共享同一内存空间和系统资源。
### 浏览器的事件循环事件循环是浏览器用于管理异步操作的机制。当我们调用一个异步函数时,它会返回一个 Promise 对象给事件循环。
1. 首先,JavaScript 引擎会将这个 Promise 对象添加到事件循环中。
2. 然后,事件循环会检查是否有任何任务需要执行。
3. 如果有任务需要执行,事件循环就会将它们添加到任务队列中。
4. 最后,事件循环会不断地从任务队列中取出任务并执行它们。
### 宏任务和微任务在事件循环中,我们可以分为两种类型的任务:
* **宏任务**:宏任务是指那些需要等待用户交互或 I/O 操作完成的任务。例如,点击按钮、输入框失去焦点等。
* **微任务**:微任务是指那些不需要等待用户交互或 I/O 操作完成的任务。例如,Promise resolve、setTimeout 等。
### Promise面试题1. **什么是Promise?**
答:Promise 是 JavaScript 中用于处理异步操作的对象。
2. **Promise 有哪些方法?**
答:Promise 有以下几个方法:
* `then()`: 用于指定成功回调函数。
* `catch()`: 用于指定失败回调函数。
* `finally()`: 用于指定无论成功还是失败都会执行的回调函数。
3. **Promise 的状态有哪些?**
答:Promise 有以下几个状态:
* **pending**:等待状态,表示 Promise 还没有被 resolve 或 reject。
* **fulfilled**:成功状态,表示 Promise 已经被 resolve。
* **rejected**:失败状态,表示 Promise 已经被 reject。
4. **Promise 的链式调用有哪些好处?**
答:Promise 的链式调用可以使得异步代码看起来像同步代码,这样可以更容易地理解和维护。
5. **如何避免 Promise 链式调用的回调函数嵌套过深的问题?**
答:可以使用 async/await 来避免回调函数的嵌套问题。
6. **Promise.all() 有哪些用途?**
答:Promise.all() 可以用于等待多个 Promise 对象同时完成。
7. **Promise.race() 有哪些用途?**
答:Promise.race() 可以用于等待多个 Promise 对象中最先完成的那个。
8. **如何使用 try-catch 来捕获 Promise 的错误?**
答:可以在 catch() 中捕获 Promise 的错误。
9. **如何使用 finally() 来执行无论成功还是失败都会执行的代码?**
答:可以在 finally() 中执行无论成功还是失败都会执行的代码。
10. **Promise 有哪些优点和缺点?**
答:Promise 的优点是可以使得异步代码看起来像同步代码,这样可以更容易地理解和维护。其缺点是可能会导致回调函数嵌套过深的问题。
11. **如何使用 async/await 来避免 Promise 回调函数的嵌套问题?**
答:可以在 async 函数中使用 await 关键字来等待 Promise 对象的结果。
12. **Promise 有哪些与其他异步处理机制的区别?**
答:Promise 与其他异步处理机制(如回调函数、事件循环)有以下几个区别:
* **语法糖**:Promise 是一种语法糖,用于使得异步代码看起来像同步代码。
* **链式调用**:Promise 支持链式调用,这样可以更容易地理解和维护。
* **错误处理**:Promise 提供了 try-catch机制来捕获错误。
13. **如何使用 Promise 来实现异步函数的链式调用?**
答:可以在 async 函数中使用 await 关键字来等待 Promise 对象的结果,然后返回一个新的 Promise 对象。
14. **Promise 有哪些与其他异步处理机制的相似之处?**
答:Promise 与其他异步处理机制(如回调函数、事件循环)有以下几个相似之处:
* **异步操作**:Promise 是一种用于处理异步操作的对象。
* **回调函数**:Promise 支持回调函数来指定成功或失败的回调函数。
15. **如何使用 Promise 来实现异步函数的错误处理?**
答:可以在 catch() 中捕获 Promise 的错误,然后执行相应的错误处理逻辑。