Promise

Promise

前端中的异步技术,类似Java中的多线程+线程结果回调

Promise是异步编程的一种解决方案,ES6将其写进了语言标准,统一语法,提供了Promise对象

Promise中储存一个未来才会结束的事件(通常是一个异步操作),他提供了统一的API,各种异步操作都可以使用方法处理

Promise有三种状态:

  • Pending(进行中)
  • Resolved(已完成,又称Fulfilled)
  • Rejected(已失败)

普通函数与回调函数

普通函数
function fun1() {
console.log("fun1 invoked")
}
console.log("code1 invoked")
fun1()
console.log("code2 invoked")
//code1 invoked
//fun1 invoked
//code2 invoked
回调函数

回调函数是一个基于事件的自动调用函数

回调函数其他的代码不会等待回调函数执行完毕

function fun1() {
  setTimeout(
      () => {
        console.log("fun1 invoked")
      }, 200
  )
}
console.log("code1 invoked")
fun1()
console.log("code2 invoked")
//code1 invoked
//code2 invoked
//fun1 invoked

Promise的基本用法

resolve参数是一个函数,在回调函数中如果调用resolve方法,promise会由pending装换为resolved

reject参数也是一个函数,在回调函数中如果调用reject方法,promise会由pending装换为reject

在promise对象执行函数时,可将参数传递给promise.then中

let promise = new Promise((resolve, reject) => {
  console.log('function invoke')
  resolve("resolve")
  //reject("reject")
})
promise.then

promise.then中有两个函数,这两个函数分别对应着promise状态为resolve和reject的执行函数

promise.then(
    (value) => {
      // promise转换为resolve状态时,执行的函数
      console.log("promise " + value)
    },
    (value) => {
      // promise转换为reject状态时,执行的函数
      console.log("promise " + value)
    }
)

promise.then.catch

由promise.then继续调用.catch

当promise状态为 reject 或者 promise 出现异常或失败时,会执行的函数

使用catch之后,then中只需要写一个函数就行,因为catch中会包含异常和失败

promise.then(
    (value) => {
      // promise转换为resolve状态时,执行的函数
      console.log("promise " + value)
    }
).catch(
    (value) => {
      console.log("promise " + value)
    }
)

async和await

async

sync中文释义:同步

async 帮助我们使用简介的语法获得一个promise对象

async标识的函数返回的结果就是一个promise对象!!!

如果函数本身的返回值就是一个promise,则状态由内部的promise决定

//第一种声明方法
async function fun() {

}
let promise = fun()

//第二种声明方法(箭头函数)
let promise = async () => {

}

当方法正常返回值,那么结果就是成功的,并将返回值作为参数传递给 promise.then

let promise = async () => {
  return 10
}

promise().then(
    (value) => {
      console.log("promise resolve:" + value)
    }
).catch(
    (value) => {
      console.log("promise reject:" + value)
    }
)
// promise resolve:10

当方法执行失败或者有异常,结果就是失败的,并将错误信息作为参数传递给 promise.then.catch

let promise = async () => {
  // return 10
  throw new Error("something went wrong");
}

promise().then(
    (value) => {
      console.log("promise resolve:" + value)
    }
).catch(
    (value) => {
      console.log("promise reject:" + value)
    }
)
// promise reject:Error: something went wrong

await
  • 右边如果是一个普通值,则直接返回该值

  • 右边如果是一个成功状态的promise,则会返回成功状态的结果

let promise = async () => {
  return 10
}
let res = await promise()
console.log(res)	
// 10
  • 右边如果是一个失败状态的promise,那么await会直接抛出异常
let promise = async () => {
    // return 10
    throw new Error("something went wrong");
}
let res = await promise()
console.log(res)
// Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
  • await必须在async修饰的函数中使用,async函数中可以没有await
  • 在同一个函数内await后边的代码会等待await执行完毕继续运行
let promise = async () => {
    // return 10
    throw new Error("something went wrong");
}

// 这个函数必须使用async修饰,因为await必须在async修饰的函数使用
async function fun() {
    try {
        let res = await promise()
        console.log(res) // 这行代码不会执行,因为await报异常,在同一个函数内,后续代码会等待await执行之后在执行
    } catch (e) {
        console.log("catch: " + e)
    }
    // Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
}

fun()