📜  javascript的promise语法(1)

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

JavaScript的Promise语法

JavaScript是一门异步编程语言,而Promise是JavaScript中处理异步编程的一种非常有用的方式。本篇文章中将介绍Promise的概念、使用方法以及一些高级应用。

什么是Promise?

Promise是一种用于异步编程的JavaScript对象,它代表了一个异步操作的最终完成或者失败的结果。Promise对象有三种状态:

  • Pending(进行中):初始状态,既不是成功,也不是失败状态。
  • Fulfilled(已成功):意味着操作成功地完成,即异步操作返回了一个值。
  • Rejected(已失败):意味着操作失败了,即异步操作返回了一个错误或者异常。

在Promise对象的生命周期中,除了Pending状态外,Promise对象的状态是不可变的。即一旦Promise对象的状态发生了改变,它就会一直保持在这个状态,不会再进行改变。

Promise的使用

接下来,我们将介绍Promise的基本使用方法。我们将使用一个简单的例子来说明Promise的用法。假设我们要使用Promise对象获取一个文件的内容:

const getFileContent = (url) => {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.onload = () => resolve(xhr.responseText);
    xhr.onerror = () => reject(xhr.statusText);
    xhr.send();
  });
};

上面的代码使用了Promise对象来处理异步操作,并返回一个新的Promise对象。在Promise构造函数中,resolve与reject是两个函数,它们分别用于表示Promise的两种状态:Fulfilled和Rejected。

如果操作成功,我们调用resolve函数,并且把异步操作的结果传递给它。如果操作失败,我们调用reject函数,并且把错误原因传递给它。最后,我们通过return语句返回新的Promise对象。

现在,我们已经定义了一个可以获取文件内容的函数,那么如何使用它呢?我们可以这样调用它:

getFileContent('file.txt')
  .then((content) => console.log(content))
  .catch((error) => console.log(error));

在上面的代码中,我们使用了then方法来处理Promise对象变为Fulfilled状态时的回调函数,使用catch方法来处理Promise对象变为Rejected状态时的回调函数。

Promise链式调用

Promise对象还支持链式调用,即在一个Promise对象的处理函数(Fulfilled或者Rejected)中再返回一个新的Promise对象。例如:

getRequest('https://api.github.com/users')
  .then((response) => JSON.parse(response))
  .then((data) => console.log(data))
  .catch((error) => console.log(error));

在上面的例子中,我们调用了一个getRequest函数,它返回了一个Promise对象。在第一个then方法中,我们解析了响应数据(JSON.parse(response)),并返回了一个新的Promise对象(这个新的Promise对象是我们手动创建的,它的状态为Fulfilled)。

在第二个then方法中,接收到的参数data就是上一个Promise对象resolve函数的返回值,即已经解析好的JSON数据。这个then方法还返回了一个新的Promise对象,因此我们可以继续在它后面链式调用其他的方法。

在链式调用中,如果上一个Promise对象的状态是Rejected,那么它后面的方法(then或者catch)将不会被执行,而是跳过,直接执行下一个Promise对象的处理函数。

Promise.all

Promise.all() 方法可以将一组 Promise 对象包装成一个新的 Promise 对象,只有当所有的 Promise 对象都处于 Fulfilled 状态时包装 Promise 才会处于 Fulfilled 状态,此时成功回调的结果和 Promise 对象数组的顺序一致;如果有一个 Promise 处于 Rejected 状态,包装 Promise 就会立即进入 Rejected 状态,此时失败回调返回此处 Rejected 状态传递的信息。

let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
  .then(function (results) {
    console.log(results); // [1, 2, 3]
  })
  .catch(function (err) {
    console.error(err);
  });
Promise.race

Promise.race() 方法同样是将一组 Promise 对象包装成一个新的 Promise 对象,只有其中有一个 Promise 对象处于 Fulfilled 或者 Rejected 状态时,则包装 Promise 立即进入 Fulfilled 或者 Rejected 状态,并执行相应状态的回调函数;否则包装 Promsie 会处于 Pending 状态,等待第一个状态改变的 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 (value) {
  console.log(value); // "two"
  // Both resolve, but promise2 is faster
});
参考资料