Skip to content

异步编程

Promise

Promise 是异步编程的一种解决方案,它代表了一个异步操作的最终结果。它有三种状态:

  • Pending: 初始状态,表示异步操作还没有完成。

  • Fulfilled: 成功状态,表示异步操作已经成功完成。

  • Rejected: 失败状态,表示异步操作失败。

  • resolve(): 将 Promise 对象的状态从 Pending 变为 Fulfilled,并将异步操作的结果传递给回调函数。

  • reject(): 将 Promise 对象的状态从 Pending 变为 Rejected,并将异步操作的错误信息传递给回调函数。

  • then() 方法,允许指定成功和失败状态的回调函数。then()` 方法返回一个新的 Promise 对象,可以链式调用。

  • catch() 方法用于指定失败状态的回调函数.

typescript
const promise = new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {
        resolve('success');
    }, 1000);
});

promise.then((result) => {
    console.log(result);
}).catch((error) => {
    console.error(error);
});

async/await

async/await 是 ES2017 引入的异步编程语法。它可以让我们以同步的方式编写异步代码,避免了回调地狱。

  • async 关键字声明一个函数为异步函数,函数体内可以使用 await 关键字等待 Promise 对象。
  • await 关键字只能在异步函数中使用,用于等待 Promise 对象。
  • try...catch 语句捕获异步函数中抛出的错误。
typescript
async function fetchData() {
    try {
        const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
        const data = await response.json();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
}

fetchData();

异步迭代器

异步迭代器是 ES2018 引入的新语法,它允许我们异步地遍历可迭代对象(如 Array、Map、Set、String、TypedArray、arguments 对象等)。

  • Symbol.asyncIterator 属性是一个异步迭代器,可以用 for-await-of 循环遍历。
  • next() 方法返回一个 Promise 对象,该对象包含两个属性:donevaluedone 属性是一个布尔值,表示是否遍历结束; value 属性是当前迭代的值。
typescript
const asyncIterator = someAsyncFunction();
const array = [1, 2, 3];
const set = new Set([1, 2, 3]);
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);

for await (const value of asyncIterator) {
    console.log(value);
}

for await (const value of array) {
    console.log(value);
}

for await (const value of set) {
    console.log(value);
}

for await (const [key, value] of map) {
    console.log(key, value);
}