ES6异步处理方式: Promise / async await

参考资料:
- JS Promise API
- ES6 Async/Await 完爆Promise的6个原因

Promise

js的异步处理,一直是使用callback的,但当我们要连续执行多个异步的时候,就会导致callback层层嵌套,很不友好。所以在ES6中,加入了Promise来帮助处理异步

api

  • Promise.resolve()    执行成功
  • Promise.reject()     执行失败
  • Promise.prototype.then() 递延处理
  • Promise.all() 所有的完成 Promise.all方法常被用于处理多个promise对象的状态集合

可以这样理解: Promise是一个构造函数,使用时要 new Promise(x)来构造一个对象,其中的参数x是一个函数,(resolve, reject) => { 异步代码返回data },在函数中执行异步代码,如果异步执行成功,则调用resolve(data),错误则调用reject(data),如下列代码:

// 新建一个promise
let myPromise = new Promise((resolve, reject) => {
    // 用setTimeout模拟异步
    //当异步代码执行成功时,我们才会调用resolve(...), 
    //当异步代码失败时就会调用reject(...),
    //他们的作用就是把返回值传给then()方法
    setTimeout(() => {
        resolve('执行成功!')
    }, 3000)
})

// 使用,其中的successMessage就是resolve(...)方法传入的值
// 然后在then方法中对得到的异步数据进行处理
myPromise.then((successMessage)=>{
    console.log(successMessage)  // 输出: 执行成功!
})

then方法也返回一个Promise对象,所以可以支持链式调用。

async await

Promise之后,js还推出了另一种异步处理方式,据说比Promise更好用,让我们来看看async 和 await吧。
Async/await建立于Promise之上,很多人认为的最高境界,就是根本不用关心它是不是异步。async await就是异步操作的终极解决方案。

语法

试想一下,我们有一个getJSON方法,该方法发送一个异步请求JSON数据,并返回一个promise对象。这个promise对象的resolve方法传递异步获得的JSON数据。具体例子的使用如下:

getJSON = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('返回的数据')
        },200)
    })
}

// 使用Promise
const makeRequest = () =>
    getJSON()
        .then(data => {
            console.log(data)
            return "done"
        })

makeRequest()

// 使用async await
const makeRequest = async () => {
    console.log(await getJSON())
    return "done"
}

makeRequest()

说明:使用async/await时,在主体函数前使用async,表示这是个异步函数,await只能使用在async函数内部。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
示例中,await getJSON() 说明console.log的调用,会等到getJSON()返回的promise对象resolve之后触发。

猜你喜欢

转载自blog.csdn.net/creabine/article/details/79877424