谈谈promise 、generator、async三者之间的关系

1,927 阅读2分钟

说起promise,大家用都都比较多,简单的说是对异步请求进行了二次封装,避免回调地狱的出现,但有的小伙伴觉得不好理解。接下来,结合生成器给大家解释一下。

首先看下代码:

var pro = function(){
    return new Promise((resolve,reject){
        if(true){
            resolve('success')
        }else{
            reject('error')
        }
    })
}
var p = pro();
p.then(v=>console.log(v),e=>console.log(e)) success、error

这是promise最基础的使用方法,解决了回调函数的层层嵌套的问题

接下来看下generator

什么是generator,字面意思就是生成器,从字面上来看就是用于生成迭代器对象的函数,看下代码就明白了:

function* gen(){
    yield 'hello harden'
    yield 'hello world'
}
var g = gen() -->迭代器对象
g.next() --> {value:'hello harden',done:false}
g.next() --> {value:'hello world',done:true}

生成器函数执行后返回的是迭代器对象,迭代器对象必须通过调用next()方法执行函数到第一个yield函数处,根据返回值的done属性决定是否继续迭代器是否迭代完毕。

最后聊下async 和 await

var pro = function(){
    return new Promise((resolve,reject){
        resolve('success')
    }
}
async function asy(){
    let a = await pro()
    return a
}
asy().then(v=>console.log(v)) 'success'

大家发现async和generator有什么不同的了吗?genertor函数返回的是迭代器对象,而async 返回的是promise对象。generator需要手动调用next方法获取值,而async函数自动开启迭代,使得异步过程的写法和同步过程写法保持一致,当然也存在co和thunk模块可以自动开启生成器的迭代。

小结:本文简单介绍了promise/generator/async 三者的使用方法,以此来记录自己对es6异步这块的理解,欢迎大家批评指正,邮箱:529309498@qq.com