收录了这篇文章
ES6(ECMAScript 2015)引入了Promise来改进JavaScript中的异步编程模型。Promise是一种处理异步操作(如网络请求、文件读写等)的方式,它可以让异步代码更易于理解和维护,特别是解决了“回调地狱”问题。下面是一个基础的ES6 Promise教程。
一,Promise 基本概念
Promise 是一个对象,用来封装一个异步操作并可以获取其成功或失败的结果值。Promise有三种状态:
- Pending(等待中):初始状态,既没有被兑现,也没有被拒绝。
- Fulfilled(已成功):当异步操作成功完成时,Promise变为fulfilled状态,并且调用其then方法注册的回调函数。
- 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和迭代
声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。