ES6 Promise 和 async/await 教程
JavaScript 教程
收录了这篇文章

ES6(ECMAScript 2015)引入了Promise来改进JavaScript中的异步编程模型。Promise是一种处理异步操作(如网络请求、文件读写等)的方式,它可以让异步代码更易于理解和维护,特别是解决了“回调地狱”问题。下面是一个基础的ES6 Promise教程。

一,Promise 基本概念

Promise 是一个对象,用来封装一个异步操作并可以获取其成功或失败的结果值。Promise有三种状态:

  1. Pending(等待中):初始状态,既没有被兑现,也没有被拒绝。
  2. Fulfilled(已成功):当异步操作成功完成时,Promise变为fulfilled状态,并且调用其then方法注册的回调函数。
  3. Rejected(已失败):当异步操作失败时,Promise变为rejected状态,并且调用其catch方法注册的错误处理回调函数。

状态不可逆:Promise的状态一旦从pending变为fulfilled或rejected,就不会再变了。

创建Promise

使用new Promise((resolve, reject) => { ... })来创建一个Promise实例。

const myPromise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    if (/* 成功条件 */) {
      resolve("操作成功!");
    } else {
      reject("操作失败!");
    }
  }, 2000);
});

消费Promise

  • then():注册成功回调。
  • catch():注册失败回调。
  • finally():无论Promise成功还是失败都会执行的回调。
myPromise
  .then(result => console.log(result)) // 操作成功时的处理
  .catch(error => console.error(error)) // 操作失败时的处理
  .finally(() => console.log("无论如何都会执行"));

静态方法

  • Promise.resolve(value):返回一个已经fulfilled的Promise,可将非Promise对象转换为Promise。
  • Promise.reject(reason):返回一个已经rejected的Promise。
  • Promise.all(iterable):等待所有Promise都完成(fulfilled或rejected),然后返回包含所有结果的数组。如果有任何一个Promise失败,则立即reject。
  • Promise.race(iterable):等待迭代器中的某个Promise完成(fulfilled或rejected),然后返回那个结果,不管其它Promise是否完成。
  • Promise.any(iterable):只要迭代器中有任意一个Promise成功,就返回那个成功的Promise结果;如果所有Promise都失败,则返回一个包含所有失败原因的AggregateError实例。

示例

假设我们有一个模拟的异步API请求:

function fetchUserData(userId) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (userId === 1) {
        resolve({ id: userId, name: "Alice" });
      } else {
        reject("User not found");
      }
    }, 1000);
  });
}

fetchUserData(1)
  .then(user => console.log(`User: ${user.name}`))
  .catch(err => console.error(err));

二, async/await

基本概念

  • async关键字用于声明一个函数是异步的,它会隐式地返回一个Promise。
  • await关键字只能在async函数内部使用,用于等待Promise的解决并返回结果。

使用async/await

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('请求失败:', error);
  }
}

fetchData();

 

三,Generator函数与yield

基本概念

Generator函数是一种特殊的函数,可以暂停执行并在需要时恢复。通过yield关键字可以暂停Generator函数的执行,并返回一个值给调用者。

使用Generator处理异步

虽然Generator本身不直接属于ES6异步编程的一部分,但结合co库或其他第三方库,可以实现类似于async/await的异步控制流。

function* getData() {
  const result = yield fetch('https://api.example.com/data');
  const data = yield result.json();
  return data;
}

const it = getData();
const { value, done } = it.next(); // 开始执行
// 需要手动处理Promise和迭代

 

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
WordPress 使用 shortcode() 增加编辑器功能
WordPress 主题激活和取消激活钩子
CSS3 实现 Switch 开关
JavaScript 函数
JavaScript DOM 文档对象模型
JavaScript BOM 浏览器对象模型
Land APP 小程序
JavaScript 数组