promise不完全总结

77 阅读2分钟

理解

promise可以理解为一个对象,该对象包含了一个还未完成的一个异步函数的结果(成功/失败),我们可以对其成功或者失败的结果进行进一步的处理。

mdn对promise 3种状态的描述:

  • 待定(pending) :初始状态,既没有被兑现,也没有被拒绝。这是调用 fetch() 返回 Promise 时的状态,此时请求还在进行中。
  • 已兑现(fulfilled) :意味着操作成功完成。当 Promise 完成时,它的 then() 处理函数被调用。
  • 已拒绝(rejected) :意味着操作失败。当一个 Promise 失败时,它的 catch() 处理函数被调用。
var myPromise = function() {
  return new Promise((resolve, reject) => {
    setTimeout(() {
       resolve()
    }, 1500)
  })
}
console.log(myPromise());
myPromise().then(res => {
  console.log('success')
});
console.log('开始执行')

上例中发生以下几件事情:

1、定义了一个promise对象,打印Promise { <state>: "pending" }

2、调用myPromise()并在then方法中传入异步函数执行成功的处理函数;

3、继续执行后面的同步代码,打印'开始执行'

4、1.5s后myPromise触发成功的回调,打印'success'

链式调用

在then的回调函数中,可以return 出去一个处理对象,交给下一个then的回调函数进行处理。

fetch('/api/getData')
  .then(response => {
    return response.json();
  })
  .then(res => {
    console.log(res);
  })

错误捕获

在异步函数执行过程中,或者在then的回调函数处理中抛出错误,promise都会在最后的catch的回调函数中捕获到。

fetch('/api/getData')
 .then(response => {
   if (!response.ok) {
     throw new Error('请求错误')
   }
   return response.json();
 })
 .then(res => {
   console.log(res);
 })
 .catch(err => {
   console.log(err)
 })

async/awiat

可以理解为通过同步的写法来写异步函数,注意await 关键词必须在async 函数中,来配合使用,单独使用会抛出错误。

async function func() {
 var response = await fetch('/api/getData');
 var res = response.json();
 console.log(res)
}
func()

捕获执行过程中的错误,可以采用2种方式:

1、使用try...catch

async function func() {
  try{
    var response = await fetch('/api/getData');
    var res = response.json();
    console.log(res);
  } catch(err) {
    console.log(err)
  }
}
func()

2、await 后面的异步代码跟上catch

async function func() {
  var response = await fetch('/api/getData')
    .catch(err => {
      console.log(err)
    })
  var res = response.json();
  console.log(res)
}
func()