JavaScript Hoisting
JavaScript 特殊字符 

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 的功能,使其更加灵活和适应各种复杂的异步场景。