📜  角管参数 - Javascript (1)

📅  最后修改于: 2023-12-03 15:41:35.222000             🧑  作者: Mango

角管参数 - JavaScript

简介

在 JavaScript 中,角管对象 (Promise) 通常用于异步编程。Promise 对象代表一个异步操作(通常是通过网络请求得到数据、读取文件等)的最终状态,可分为三种状态:pending (等待态),fulfilled (成功态),rejected (失败态)。当 Promise 对象的状态发生改变,它绑定的回调函数就会被调用。

创建 Promise

在 JavaScript 中,可以通过 Promise 构造函数创建 Promise 对象。它接收一个参数——一个函数,该函数有两个参数:resolve 和 reject。resolve 函数用于将 Promise 对象的状态从 pending 变为 fulfilled,reject 用于将状态变为 rejected。

语法:

const promise = new Promise(function(resolve, reject) {
  // 异步操作
});

示例:

const promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('成功');
    // 或者
    // reject('失败');
  }, 3000);
});

promise.then(function(result) {
  console.log(result);  // '成功'
}).catch(function(error) {
  console.log(error);
});
Promise 参数

Promise 的构造函数还可以接收一个可选参数——executor 函数。该函数在 Promise 实例化后立即执行,如果在 Promise 构造函数中发生错误,该 Promise 对象会被拒绝 (rejected)。

语法:

const promise = new Promise(executor);

示例:

const promise = new Promise(function(resolve, reject) {
  throw new Error('发生错误!');
});

promise.catch(function(error) {
  console.log(error.message);  // '发生错误!'
});
Promise 方法

Promise 有许多实例方法可以使用。以下是其中一些方法:

Promise.prototype.then()

Promise 实例的 then 方法用于指定 fulfilled 和 rejected 状态的回调。then 方法接收两个回调函数作为参数:onFulfilled 和 onRejected(可选),其中 onFulfilled 在 Promise 对象的状态变为 fulfilled 时被调用,onRejected 在状态变为 rejected 时被调用。

语法:

promise.then(onFulfilled, onRejected);

示例:

const promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('成功');
  }, 3000);
});

promise.then(function(result) {
  console.log(result);  // '成功'
}).catch(function(error) {
  console.log(error);
});
Promise.prototype.catch()

Promise 实例的 catch 方法用于指定 rejected 状态的回调。

语法:

promise.catch(onRejected);

示例:

const promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject(new Error('失败'));
  }, 3000);
});

promise.then(function(result) {
  console.log(result);
}).catch(function(error) {
  console.log(error.message);  // '失败'
});
Promise.prototype.finally()

Promise 实例的 finally 方法用于指定不管 Promise 对象的状态是 fulfilled 还是 rejected,都会执行的回调函数。

语法:

promise.catch(onFinally);

示例:

const promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('成功');
  }, 3000);
});

promise.then(function(result) {
  console.log(result);
}).catch(function(error) {
  console.log(error);
}).finally(function() {
  console.log('执行完毕!');
});
Promise.all()

Promise.all 方法将多个 Promise 实例包装成一个新的 Promise 实例。当所有 Promise 对象都完成时,该 Promise 才会被 fulfilled,返回所有 Promise 对象的结果 (数组);如果有一个 Promise 对象被 rejected,该 Promise 就会被 rejected,返回第一个被 rejected 的 Promise 的错误原因。

语法:

Promise.all([p1, p2, p3, ...]);

示例:

const p1 = Promise.resolve('成功1');
const p2 = Promise.resolve('成功2');
const p3 = Promise.reject(new Error('失败'));

Promise.all([p1, p2, p3]).then(function(result) {
  console.log(result);
}).catch(function(error) {
  console.log(error.message);  // '失败'
});
Promise.race()

Promise.race 方法将多个 Promise 实例包装成一个新的 Promise 实例。当任何一个 Promise 对象都完成时,该 Promise 就会被 fulfilled 或 rejected,返回第一个完成的 Promise 对象的结果。

语法:

Promise.race([p1, p2, p3, ...]);

示例:

const p1 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('成功1');
  }, 1000);
});

const p2 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('成功2');
  }, 3000);
});

Promise.race([p1, p2]).then(function(result) {
  console.log(result);  // '成功1'
}).catch(function(error) {
  console.log(error);
});
总结

Promise 是 JavaScript 中异步编程的重要概念,它可以优雅地解决回调地狱问题,提高代码的可读性和可维护性。掌握 Promise 的使用,能让你的代码更具有高效性、简洁性和可读性。