详细了解promise介绍,作用以及常用用法

77 阅读2分钟

promise介绍

Promise是JavaScript中的一个对象,同时也是异步编程的一种解决方案,它的构造函数是同步执行的,then 方法是异步执行的。

promise作用

promise最直观的区别就是解决回调地狱的问题,.then().catch()方法将异步操作组织成更加清晰的结构。

Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)

pedding->初始状态:调用promise时,一开始就呈现出等待状态,遇到resolve或者reject之前,都处于这个状态,且可以改变,但如果确定了状态(fulfilled/reject),则结果将永远不变,不能再次修改

fulfilled->成功状态:在执行了resolve后,promise则会从pedding变成fulfilled,后续会进入.then 的回调函数中,在回调函数的第一个参数函数中可以获取到值

rejected->失败状态:在执行了reject后,promise状态会变成rejected,rejected函数传递的参数,可以在.then的第二个参数函数中获取的到,或者是在.catch获取到,但是如果程序上的错误,得通过.catch函数去拿到失败消息,在.then中是获取不了的

常见的写法

const p1 = new Promise((resolve, reject) => {
   resolve("成功");
});
p1.then((res) => {
   console.log("----打印:p1", res); //----打印:p1 成功
});

如果promise处于拒绝的状态可以直接在.then的失败回调中,获取reject的值(then里面的第二个参数);也可以在.catch中获取;如果两者同时出现代码中,看看是catch写在前面还是.then函数写在前面 常见业务中拒绝状态用.then去执行回调,程序异常用catch

  const p1 = new Promise((resolve, reject) => {
  reject("失败");
});
p1.then(
  (res) => {
    console.log("----打印:p1", res); //不执行
  },
  (rej) => {
    console.log("----打印:p1", rej); //----打印:p1 失败
  }
)
.catch(
    (error)=>{
        console.log("----打印:catch", error);//因为.then是放在.catch前面不会打印“失败”,如果程序异常,才会报异常信息
    }
);

promise常用用法

Promise.then
doSomething().then(function(result) {
  return doSomethingElse(result);
})
.then(function(newResult) {
  return doThirdThing(newResult);
})
.then(function(finalResult) {
  console.log('得到最终结果: ' + finalResult);
})
.catch(failureCallback);
Promise.catch
const p = new Promise((resolve, reject) => {
  reject("拒绝");
  console.log("----打印:"); //会输出
  throw new Error("抛出错误"); //这一句改变promise状态,因为状态已经决定了
});
p.catch((error) => {
  console.log(error); // :--拒绝
});
Promise.all
var p1 = new Promise((resoleve, reject) => {
  setTimeout(() => {
    resoleve("p1--3000");
  }, 3000);
});
var p2 = new Promise((resoleve, reject) => {
  setTimeout(() => {
    resoleve("p2--1000");
  }, 1000);
});
var p3 = new Promise((resoleve, reject) => {
  setTimeout(() => {
    console.log("----打印:看看是先执行失败,还是全部执行完再catch");
    resoleve("p3--5000");
  }, 5000);
});
 var promiseArr = [p1, p2, p3];
 console.time("promiseArr");
  Promise.all(promiseArr)
    .then((res) => {
      console.log("res", res); //res [ 'p1--3000', 'p2--1000', 'p3--5000' ]
      console.timeEnd("promiseArr"); // promiseArr: 5.020s
    })
    .catch((err) => console.log(err));