我终于弄懂了Promise

1.什么是Promise
a) ES6 异步编程的一种解决方案,比传统的方案(回调函数和事件)更加的合理和强大
b) 好处 异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数
c) promise可以解决异步的问题,本身不能说promise是异步的

2.Promise特点
a) 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、resolved(已成功)和rejected(已失败)
b) 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为resolved和从pending变为rejected
c) promise内部发生错误,不会影响到外部程序的执行。
d) 无法取消Promise。一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

3.基础用法
创造Promise实例时,必须传入一个函数作为参数

new Promise(() => {});
new Promise(); // 报错

该函数可以接收另外两个由JavaScript引擎提供的函数,resolve和reject。函数作用:
resolve——将Promise对象的状态从pending变为resolved,将异步操作的结果,作为参数传递出去
reject——将Promise对象的状态从pending变为rejected,将异步操作报出的错误,作为参数传递出去

let promise = new Promise((resolve, reject) => {
  // do something
  if (true) {
    // 将参数返回,供then方法使用
    resolve("value");
  } else {
    // 将参数返回,供then方法使用
    reject("error");
  }
});

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then(
  value => {
    // resolved时调用,value为resolve函数返回的参数
    console.log(value);
  },
  err => {
    // rejected时调用,err为reject函数返回的参数
    console.log(err);
  }
);

当then方法只有一个函数参数时,此时为resolved状态的回调方法

promise.then(value => {
    // 只有状态为resolved时才能调用,如果返回的是rejected状态,则报错 Uncaught (in promise) error
    console.log(value);
  });

只有当promise的状态变为resolved或者rejected时,then方法才会被调用
Promise 新建后就会立即执行,并且调用resolve或reject后不会终结 Promise的参数函数的执行。

let promise = new Promise(function(resolve) {
  console.log("Promise");
  resolve();
  console.log("!!!")
});

promise.then(function() {
  console.log("resolved.");
});
console.log("Hi!");

// Promise
// !!!
// Hi!
// resolved

resolve返回的是另外一个Promise实例

const p1 = new Promise((_, reject) => {
  setTimeout(() => reject('error'), 3000);
});

const p2 = new Promise(resolve => {
  setTimeout(() => resolve(p1), 1000);
});

p2.then(
  result => console.log(result),
  error => console.log(error) // error
);

上面代码中,p1是一个 Promise,3 秒之后变为rejected。p2的状态在 1 秒之后改变,resolve方法返回的是p1。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。所以,后面的then语句都变成针对后者(p1)。又过了 2 秒,p1变为rejected,导致触发catch方法指定的回调函数。
以上是原文解释,我们可以理解成p2.then 实际上是p1.then

你可能感兴趣的:(我终于弄懂了Promise)