ES6之Promise、async和await

1 Promise

Promise是ES6的新特性,Promise被定义为一个构造函数

Promise
//输出
ƒ Promise() { [native code] }

我们创建一个Promise对象,观察它有哪些属性和方法

可以看到:

  1. Promise对象有两个属性:状态和结果
  2. 原型对象上有then()、catch()、finally()等方法
  3. 构造函数里面有resolve()、reject()等方法

1.1 Promise的特点

Promise对象的状态不受外界影响,有3种状态:pending、fullfilled、rejected。这些状态的改变由异步操作结果决定(resolve()方法和reject()方法)

一旦状态改变,就不会再变,任何时候都可以得到这个结果。

Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected

1.2 创建Promise对象的方式

  • new Promise
  • then的返回值
  • catch 的返回值
  • finally 的返回值
  • async 函数的返回值

注意,我们使用new Promise()构造函数实例化一个Promise对象时,构造函数的参数是一个函数,且该函数的参数也是函数,且固定为resolve和reject,举例:

var probj = new Promise((aaa,bbb)=>{
    aaa('这是啥')
})
// 打印probj
probj
//打印结果
Promise {<fulfilled>: '这是啥'}

如果我们多传递一个参数,则会报错

var probj = new Promise((resolve,reject,three)=>{
    resolve('这又是啥')
})
VM1232:1 Uncaught SyntaxError: Invalid or unexpected token
probj
Promise {<fulfilled>: '这又是啥'}

1.3 更改promise状态方式

  • resove() fulfilled 已接受
  • reject() rejected 已拒绝

1.4 [[PromiseResult]] 赋值有几种方式

  • resolve reject的实参
  • then 的return
  • async 的return
  • await 返回值
var probj = new Promise((resolve,reject)=>{
    resolve({name:'szj'})
})
probj.then((res)=> {
            console.log(res)
        })
{name: 'szj'}
Promise {<fulfilled>: undefined} //注意,这个打印是执行probj.catch的返回值(返回值也是一个Promise对象),不是probj实例
//下面才是probj实例
probj
Promise {<fulfilled>: {[[PromiseState]]: "fulfilled", [[PromiseResult]]: Object}}

2 async和await

使用async function可以定义一个异步函数,可以起到和Promise异步调用相同的效果。

在async函数内部,可以用await调用另一个异步函数。

普通函数调用async函数会报错。

示例

async function get(url) {
    try {
        let resp = await fetch(url);
        return resp.json();
    } catch (e) {
        // 出错了
    }
}

fetch是一个异步函数,返回Promise对象

使用try-catch代替Promise中的then-catch。

 

posted @ 2022-12-02 14:33  zhenjingcool  阅读(105)  评论(0编辑  收藏  举报