深入理解async/await处理异步操作

2 下载量 185 浏览量 更新于2024-08-31 收藏 86KB PDF 举报
"详解用async/await来处理异步,通过示例代码详细介绍异步编程的概念及使用方式,包括async函数的定义与调用,以及如何通过.then()处理返回的Promise对象" 在JavaScript中,异步编程是处理耗时操作(如网络请求、文件读取等)的关键技术,避免了程序的阻塞。`async/await`是一种更优雅的处理异步操作的方法,它引入自ES2017,使得异步代码看起来更接近同步代码,提高了代码的可读性和可维护性。 首先,`async`关键字用于声明一个异步函数。异步函数会返回一个Promise,即使函数内部没有显式地返回Promise。例如: ```javascript async function timeout() { return 'hello world'; } ``` 这里的`timeout`函数就是一个异步函数,调用它并不会立即返回结果,而是返回一个Promise。当你直接打印`timeout()`时,你会看到一个Promise对象,而不是预期的字符串。这是因为异步函数内部的返回值会被包装成一个Promise。 为了获取异步函数的实际返回值,我们需要使用`.then()`链式调用来处理Promise。如下所示: ```javascript timeout() .then(result => { console.log(result); // 输出:'hello world' }); console.log('虽然在后面,但是我先执行'); ``` 在这里,`.then()`接收一个回调函数,当Promise解析时,回调函数会被调用,并传入异步函数的返回值。因此,`result`变量将包含`timeout`函数的返回值——'hello world'。 `await`关键字则允许我们在异步函数内部等待Promise的结果。当你在异步函数中使用`await`时,后面的表达式必须是一个Promise。`await`会暂停异步函数的执行,直到Promise解析或拒绝,然后返回Promise的结果。例如: ```javascript async function getAsyncData() { const response = await fetch('https://api.example.com/data'); const data = await response.json(); console.log(data); } getAsyncData(); console.log('这是同步执行的'); ``` 在这个例子中,`fetch`返回一个Promise,我们使用`await`等待其解析得到响应对象。接着,`response.json()`也是一个Promise,我们再次使用`await`获取JSON数据。这样,异步操作被分解成了易于理解的步骤,而不会阻塞其他代码的执行。 `async/await`提供了一种更加简洁和直观的方式来处理异步操作。它降低了回调地狱的复杂性,使得错误处理更加清晰,并且与同步代码的写作风格保持一致,提升了开发体验。然而,需要注意的是,`await`只能在`async`函数内部使用,不能在全局作用域或普通函数中直接使用。