JavaScript Promise
在 JavaScript 中,Promise 是一种用于处理异步操作的对象,它代表了一个异步操作的最终完成或失败,并可以返回其结果。Promise 提供了一种更加结构化和清晰的方式来管理异步代码,避免了传统的回调地狱(Callback Hell)问题。
创建一个 Promise
一个 Promise 可以处于以下三种状态之一:
Pending(进行中):初始状态,既不是成功,也不是失败状态。
Fulfilled(已完成):操作成功完成。
Rejected(已失败):操作失败。
// 创建一个 Promise 对象 let promise = new Promise(function(resolve, reject) { // 异步操作 setTimeout(function() { let success = true; // 模拟异步操作成功或失败 if (success) { resolve('Operation succeeded'); // 将 Promise 的状态改为 Fulfilled } else { reject(new Error('Operation failed')); // 将 Promise 的状态改为 Rejected } }, 2000); // 模拟异步操作 });
使用 Promise
可以通过 Promise 的 then() 和 catch() 方法处理异步操作的结果或错误。
then() 方法:用于处理异步操作成功(Fulfilled)的情况。
promise.then(function(result) { console.log('Success:', result); // 输出: Success: Operation succeeded });
catch() 方法:用于处理异步操作失败(Rejected)的情况。
promise.catch(function(error) { console.error('Error:', error.message); // 输出: Error: Operation failed });
Promise 链式调用
Promise 允许链式调用,可以依次处理多个异步操作。每个 then() 方法返回一个新的 Promise,可以在其中继续进行异步操作或错误处理。
let promiseChain = new Promise(function(resolve, reject) { setTimeout(function() { resolve(1); }, 1000); }).then(function(result) { console.log(result); // 输出: 1 return result + 1; // 返回一个新的 Promise 对象 }).then(function(result) { console.log(result); // 输出: 2 return result + 1; // 返回一个新的 Promise 对象 }).then(function(result) { console.log(result); // 输出: 3 throw new Error('Something went wrong'); // 抛出一个错误,使 Promise 进入 Rejected 状态 }).catch(function(error) { console.error('Error:', error.message); // 输出: Error: Something went wrong });
Promise.all()
Promise.all() 方法接收一个由 Promise 组成的数组作为参数,当数组中所有的 Promise 都成功时才会成功,并返回所有 Promise 的结果数组;如果任何一个 Promise 失败,则立即失败并返回失败的结果。
let promise1 = Promise.resolve(1); let promise2 = Promise.resolve(2); let promise3 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, 3); }); Promise.all([promise1, promise2, promise3]).then(function(results) { console.log(results); // 输出: [1, 2, 3] });
Promise.race()
Promise.race() 方法接收一个由 Promise 组成的数组作为参数,当数组中的任意一个 Promise 成功或失败时,整个 Promise 就会成功或失败。
let promise1 = new Promise(function(resolve, reject) { setTimeout(resolve, 500, 'one'); }); let promise2 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, 'two'); }); Promise.race([promise1, promise2]).then(function(result) { console.log(result); // 输出: two (promise2 较快,所以结果为 two) });
总结
Promise 是 JavaScript 中处理异步操作的一种强大机制,它通过明确的状态转换和链式调用的方式,使得异步代码更易于理解和管理。Promise 的 then() 和 catch() 方法提供了处理成功和失败状态的简单方式,而 Promise.all() 和 Promise.race() 方法则扩展了 Promise 的功能,使其更加灵活和适应各种复杂的异步场景。