Promise

Promise

1、Promise有什么用?

Promise是ES6中的一个对象,用来解决异步编程问题的一种方案,在网上经常看到回调地狱问题,Promise把这种嵌套调用的形式改为链式调用的方式,使得代码维护起来容易。

回调地狱的例子

ajax({
  url : "http://localhost:3000/news",
  data : {
     name : '张三'
  },
  success(res) {
    ajax({
      url : "http://localhost:3000/comment",
      data : {
       id : res.id
      },
      success(res) {
        ajax({
           ....
        })
      }
    })
  }
})

用Promise可改为

let p1 =  new Promise((resolve, reject) => {
 return	ajax({
   url : "http://localhost:3000/news",
   data : {
     name : '张三'
   },
   success(res) {
     resolve(res)
   },
   error(err) {
     reject(err)
   }
}).then(res => {
   return ajax({
     url : "http://localhost:3000/comment",
     data : {
       id : res.id
     },
     success(res) => {
       resolve(res.comment)
     },
     error(err) {
       reject(err)
     }
 }).then((res => {
     ....
 }).catch(err => {
    console.log(err)
 })

改为Promise后,代码从层层嵌套变为链式,通过then方法进行连接。

2、Promise的常用方法

在上面的代码里,ajax的成功回调函数是success,失败回调函数时error;Promise也有成功的回调函数和失败时的回调函数。
查阅资料得知,Promise有三种状态:pending(执行中的状态),fulfiled
(成功状态),rejected(失败状态) pending 状态的 Promise 对象可能会变为fulfilled 状态并传递一个值给相应的状态处理方法,也可能变为失败状态(rejected)并传递失败信息。
很容易理解这三个状态,执行中的状态就是初始状态,由初始状态转变为成功或者失败,所以状态的改变就只有两条线

Promise.resolve(value)方法返回一个已给定值解析后的Promise 对象。

列子中用到的resolve方法,如果数据请求成功,它会把当前的Promise的状态该为fulfiled,方法中value会封装进Promise里

Promise.reject(err)方法返回一个带有拒绝原因的Promise对象。

如果操作执行失败,它会把当前的Promise的状态该为rejected,并把err错误信息封装进Promise里

Promise.prototype.then()和Promise.prototype.catch()

当Promise的其中任一种状态出现时,Promise 对象的 then 方法绑定的处理方法(handlers )就会被调用(then方法包含两个参数:onfulfilled 和 onrejected,它们都是 Function 类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法
catch方法其实和then方法的第二个参数一样,失败时调用

例子中如果第一个数据请求成功,它会通过then方法再次发起数据请求,
多个Promise链式操作的错误捕获可以通过一个catch处理,在例子最后用一个catch方法来捕获

posted @ 2022-09-04 16:33  UShen  阅读(24)  评论(0)    收藏  举报