JavaScript中的Promise、Async和Await

Promise 基础

Promise是JavaScript中用于处理异步操作的一个关键概念。它代表了一个尚未完成但预期在将来完成的操作。使用Promise,可以避免所谓的“回调地狱”,即多层嵌套的回调函数,从而使代码更加清晰和易于维护。

代码示例:创建一个基本的Promise
let promise = new Promise(function(resolve, reject) {
  // 异步操作代码
  setTimeout(() => {
    resolve("操作成功");
  }, 1000);
});
 
promise.then((value) => {
  console.log(value); // 输出:操作成功
});
Promise 的状态
  • pending(待定) :初始状态,既不是成功,也不是失败。
  • fulfilled(已实现) :意味着操作成功完成。
  • rejected(已拒绝) :意味着操作失败。
代码示例:展示不同状态的Promises
let fulfilledPromise = Promise.resolve('成功');
let rejectedPromise = Promise.reject('失败');
 
fulfilledPromise.then(value => console.log(value)); // 输出:成功
rejectedPromise.catch(error => console.log(error)); // 输出:失败
链式调用和错误处理

Promise的另一个优点是可以通过链式调用.then()和.catch()方法来处理复杂的异步流程。

代码示例:展示链式调用和错误处理
new Promise((resolve, reject) => {
    setTimeout(() => resolve(1), 1000);
})
.then(result => {
    console.log(result); // 输出 1
    return result * 2;
})
.then(result => {
    console.log(result); // 输出 2
    return result * 3;
})
.then(result => {
    console.log(result); // 输出 6
    return result * 4;
})
.catch(error => {
    console.log('捕获到错误:', error);
});
Async 函数

通过在函数声明前加上async关键字,可以将任何函数转换为返回Promise的异步函数。这意味着你可以使用.then()和.catch()来处理它们的结果。

代码示例:创建一个async函数
async function asyncFunction() {
  return "异步操作完成";
}
 
asyncFunction().then(value => console.log(value)); // 输出:异步操作完成
Await 关键字

await关键字只能在async函数内部使用。它可以暂停async函数的执行,等待Promise的解决(resolve),然后以Promise的值继续执行函数。

代码示例:在async函数中使用await
async function asyncFunction() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("完成"), 1000)
  });
 
  let result = await promise; // 等待,直到promise解决 (resolve)
  console.log(result); // "完成"
}
 
asyncFunction();
错误处理

在async/await中,错误处理可以通过传统的try…catch语句实现,这使得异步代码的错误处理更加直观。

代码示例:使用try…catch处理错误
async function asyncFunction() {
  try {
    let response = await fetch('http://example.com');
    let data = await response.json();
    // 处理数据
  } catch (error) {
    console.log('捕获到错误:', error);
  }
}
 
asyncFunction();
### JavaScriptPromiseasync await 的关系及用法 #### 一、Promise 基础 `Promise` 对象代表了一个异步操作的最终完成(或失败)及其结果值。它有三种状态:待定(pending),已实现(fulfilled)被拒绝(rejected)[^3]。 创建 `Promise` 实例通常是为了封装一些耗时的操作,比如网络请求或者文件读取: ```javascript const eatBreakfast = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('吃早饭'); }, 1000); }); }; ``` 此代码片段展示了如何通过返回一个新的 `Promise` 来表示一个简单的异步动作——模拟花费一秒时间来“吃早餐”。当这个过程结束时,调用 `resolve()` 方法传递成功的结果给后续链上的回调函数[^4]。 #### 二、使用 then() 处理 Promise 结果 一旦有了 `Promise`,就可以利用 `.then()` 方法注册成功的处理程序以及可选的错误处理器`.catch()`: ```javascript eatBreakfast().then(message => console.log(message)).catch(error => console.error(error)); // 输出 "吃早饭" ``` 这段代码会在 “吃早饭”的承诺兑现之后打印消息;如果过程中发生任何异常,则会被捕获并记录下来[^2]。 #### 三、引入 async/await 提升可读性维护性 为了改善传统基于回调的方式所带来的“回调地狱”,即多层嵌套难以管理的情况,ES8 引入了 `async` `await` 关键词作为更优雅地编写异步逻辑的方法之一。 - **Async Function**: 定义带有 `async` 关键字前缀的函数意味着该函数内部可以安全地使用 `await` 表达式,并且总是隐含地返回一个 `Promise`。 - **Await Expression**: 当在一个 `async` 函数体内遇到 `await` 操作符时,执行流程将会暂停在此处直至对应的 `Promise` 被解决或拒收为止,在这期间不会阻塞其他任务继续运行[^1]。 下面是一个改进版的例子,展示怎样运用这些特性让复杂的异步序列看起来像是顺序执行的一样直观易懂: ```javascript async function dailyRoutine() { try { let breakfastMessage = await eatBreakfast(); console.log(breakfastMessage); // 这里还可以加入更多类似的异步活动... } catch (error) { console.error(`遇到了一个问题: ${error}`); } } dailyRoutine(); ``` 在这个例子中,`dailyRoutine` 是一个异步函数,其中包含了对另一个异步方法 `eatBreakfast` 的调用。由于用了 `await`,所以即使实际发生了延迟,“吃早饭”这条语句也会按照预期顺序被执行完毕后再往下走,从而大大提高了代码的清晰度易于理解的程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值