Promise

126 阅读2分钟

Promise 的用途

  • Promise是异步编程的一种解决方案,所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的 API,各种异步操作都可以用同样的方法进行处理。

Promise 的优点

  1. 规范了命名,使命名不在五花八门,
  2. 使代码易懂可读,不会出现回调地狱
  3. 更加方便的捕获错误

如何创建一个 new Promise

const promise = new Promise(function(resolve, reject) {
// 成功就调用resolve,失败就调用reject
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

如何使用 Promise.prototype.then(可查 MDN)

  • then(第一个参数,第二个参数) 方法返回一个 Promise,他接受两个参数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数
  • 成功 resolved 的 promise 做出的反应
      let promise = new Promise(function(resolve, reject) {
      setTimeout(() => resolve("done!"), 1000);
      });
    
      // resolve 运行 .then 中的第一个函数
      promise.then(
      result => alert(result), // 1 秒后显示 "done!"
      error => alert(error) // 不运行
      );
    

第一个函数被运行了。

  • 失败 reject 的 promise 做出的反应
let promise = new Promise(function(resolve, reject) {
  setTimeout(() => reject(new Error("Whoops!")), 1000);
});

// reject 运行 .then 中的第二个函数
promise.then(
  result => alert(result), //  不运行
  error => alert(error) //   1 秒后显示 "Error: Whoops!"
);

如何使用 Promise.all

  • Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。
const a1 = Promise.resolve(1),
const a2 = Promise.resolve(2),
const a3 = Promise.resolve(3);
Promise.all([a1, a2, a3]).then(function (results) {
    console.log(results);  //    返回[1, 2, 3]
});

在上述代码中:promise数组中所有的promise实例都变为resolve的时候,该方法才会返回,并将所有结果传递results数组中

const a1 = Promise.reject(3);
const a2 = 42;
const a3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([a1, a2, a3]).then((values) => {
  console.log(values);
});

在上述代码中:promise数组中有一个实例是是reject的时候,此实例回调失败

如何使用 Promise.race

  • Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
let promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 200, '100');
  })
let promise2 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, '200');
})
let promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 200, '300');
});

  Promise.race = function (promises) {
    return new Promise(((resolve, reject) => {
      for (let i = 0; i < promises.length; i++) {
        Promise.resolve(promises[i]).then((data) => {
          resolve(data);
          return;
        }, err=>reject(err));
      }
    }
  ));

上述代码中:哪个promise先被处理完,就返回哪个的结果,可以是reject也可以是resolve