async,await底层和generator
时间: 2023-10-28 10:55:44 浏览: 46
在 JavaScript 中,`async` 和 `await` 是用来处理异步操作的关键字,而 `generator` 是另一种处理异步操作的方式。下面是它们之间的一些区别和联系:
1. `async/await` 是基于 Promise 的,而 `generator` 则不是。`async/await` 本质上是一种语法糖,它让 Promise 的使用更加直观和简洁,而 `generator` 则需要通过手动调用 `next()` 方法来控制异步操作的执行。
2. `async/await` 代码可读性更好。由于 `async/await` 是基于 Promise 的,所以它可以直接使用 Promise 的链式调用语法,代码可读性更好。而 `generator` 则需要手动控制异步操作的执行,代码可读性不如 `async/await`。
3. `async/await` 和 `generator` 在底层实现上也有所不同。`async/await` 的本质是一个自动执行的函数,它会自动将 `async` 函数内部的代码转化为 Promise,并自动调用 `then()` 方法获取执行结果。而 `generator` 则是通过 `yield` 关键字来暂停函数的执行,然后通过 `next()` 方法来恢复函数的执行。
总之,`async/await` 和 `generator` 都是 JavaScript 中处理异步操作的重要方式,但它们在底层实现和代码语法上有所不同。开发者可以根据实际情况选择合适的方式来处理异步操作。
相关问题
async/await/generator
async/await是ES7中引入的一种处理异步操作的语法。async函数是通过异步执行并隐式返回Promise作为结果的函数。它的实现原理是将Generator函数和自动执行器包装在一个函数中。与Generator函数相比,async函数有以下几个改进:
1. 内置执行器:Generator函数需要通过调用next方法来执行,而async函数则无需手动调用,它内部已经内置了执行器。
2. 更好的语义:async表示函数内部有异步操作,而await表示紧跟在后面的表达式需要等待结果。
3. 更广的适用性:Generator函数的yield后面只能是Thunk函数或Promise对象,而async函数的await后面可以是Promise对象和原始类型的值,返回值是一个Promise对象。
4. 方便使用:async函数可以被看作是多个异步操作包装成的一个Promise对象,可以用then方法指定下一步的操作。
async/await 的底层实现
async/await 是一种用于异步编程的语法糖,它使得编写异步代码更加简洁和易读。在底层,async/await 是通过生成器(generator)和 Promise 对象来实现的。
当一个函数被标记为 async 时,它会返回一个 Promise 对象。在函数内部,可以使用 await 关键字来等待一个 Promise 对象的完成,并将其结果返回。在等待期间,函数会暂停执行,不会阻塞其他代码的执行。
底层实现中,async 函数会被转换成一个状态机。当调用 async 函数时,它会返回一个 Promise 对象,并立即执行函数体中的代码。当遇到 await 关键字时,函数会将控制权交给外部调用者,并等待 Promise 对象的完成。一旦 Promise 对象完成,函数会恢复执行,并将 Promise 的结果作为返回值。
在生成器的帮助下,async/await 实现了暂停和恢复执行的功能。生成器是一种特殊的函数,可以通过 yield 关键字将控制权交出,并在需要时重新获取控制权。async 函数内部会使用生成器来实现暂停和恢复执行的功能。
总结一下async/await 的底层实现:
1. async 函数被转换成一个状态机。
2. await 关键字会将控制权交给外部调用者,并等待 Promise 对象的完成。
3. 生成器帮助实现了暂停和恢复执行的功能。