返回

handwrite promise

前端

在开始之前,我们先来回顾一下 JavaScript 中的异步编程。异步编程是指在程序执行过程中,某些操作需要等待其他操作完成,但我们不需要等待这些操作完成就可以继续执行程序。

在 JavaScript 中,异步编程通常使用回调函数来实现。回调函数是当一个异步操作完成时被调用的函数。例如,我们使用 setTimeout() 函数来创建一个延迟 1 秒执行的异步操作,并使用一个回调函数来处理这个操作完成后的结果:

setTimeout(function() {
  console.log('Hello, world!');
}, 1000);

这个回调函数会在 1 秒后被调用,并输出 "Hello, world!" 到控制台。

但是,当我们有多个异步操作需要处理时,使用回调函数就会变得很麻烦,因为我们需要嵌套多个回调函数,导致代码变得难以阅读和维护。

为了解决这个问题,JavaScript 引入了 Promise 对象。Promise 对象表示一个异步操作的最终完成或失败的结果。它有三个状态:

  • pending: 当一个 Promise 对象被创建时,它处于 pending 状态。
  • fulfilled: 当一个 Promise 对象的异步操作成功完成时,它处于 fulfilled 状态。
  • rejected: 当一个 Promise 对象的异步操作失败时,它处于 rejected 状态。

我们可以使用 then() 方法来处理 Promise 对象的状态。then() 方法接受两个参数,第一个参数是 fulfilled 状态时的回调函数,第二个参数是 rejected 状态时的回调函数。

例如,我们可以使用 then() 方法来处理 setTimeout() 函数的异步操作:

setTimeout(function() {
  console.log('Hello, world!');
}).then(function() {
  console.log('Done!');
});

这个 then() 方法会在 1 秒后被调用,并输出 "Hello, world!" 和 "Done!" 到控制台。

如果 setTimeout() 函数的异步操作失败,我们可以使用 catch() 方法来处理这个错误:

setTimeout(function() {
  console.log('Hello, world!');
}).then(function() {
  console.log('Done!');
}).catch(function(error) {
  console.log('Error: ' + error);
});

这个 catch() 方法会在 setTimeout() 函数的异步操作失败时被调用,并输出 "Error: ..." 到控制台。

Promise 对象的另一个重要方法是 resolve() 方法。resolve() 方法可以将一个 Promise 对象从 pending 状态转换为 fulfilled 状态。

例如,我们可以使用 resolve() 方法来创建一个 Promise 对象,并在 1 秒后将这个 Promise 对象从 pending 状态转换为 fulfilled 状态:

var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('Hello, world!');
  }, 1000);
});

promise.then(function(value) {
  console.log(value);
});

这个 promise 对象会在 1 秒后被调用,并输出 "Hello, world!" 到控制台。

Promise 对象的另一个重要方法是 reject() 方法。reject() 方法可以将一个 Promise 对象从 pending 状态转换为 rejected 状态。

例如,我们可以使用 reject() 方法来创建一个 Promise 对象,并在 1 秒后将这个 Promise 对象从 pending 状态转换为 rejected 状态:

var promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject(new Error('Something went wrong!'));
  }, 1000);
});

promise.catch(function(error) {
  console.log(error);
});

这个 promise 对象会在 1 秒后被调用,并输出 "Error: Something went wrong!" 到控制台。

Promise 对象的 constructor() 方法可以创建一个 Promise 对象。constructor() 方法接受一个参数,这个参数是一个函数,这个函数有两个参数,分别是 resolve() 和 reject() 方法。

例如,我们可以使用 constructor() 方法来创建一个 Promise 对象:

var promise = new Promise(function(resolve, reject) {
  // do something
  if (/* condition */) {
    resolve('Hello, world!');
  } else {
    reject(new Error('Something went wrong!'));
  }
});

这个 promise 对象会在条件满足时被调用,并输出 "Hello, world!" 到控制台。如果条件不满足,则会输出 "Error: Something went wrong!" 到控制台。

Promise 对象是一个非常强大的工具,可以帮助我们轻松地处理异步操作。它可以防止回调地狱,使我们的代码更加清晰和易于维护。