js callback, Promise, async+awai

2018-08-18  本文已影响33人  小白小白啦

在B站上面学写小程序,里面有一节讲解js的回调函数,Promise, async+await通过例子讲解了三种方法的进化,我觉得讲的非常好,在此记录一下。

普通代码

function ajax(){
    setTimeout(() => {
        console.log('你好')
    }, 1000);
}
ajax()
console.log('执行结束')

执行上面的代码,输出结果

D:\Document\MoocMpvue\koa-demo>node asyncawait.js
执行结束
你好

可以看到先执行下面的代码,打印出“执行结束”,再去执行上面的代码'你好',和我们预期不一样。

callback

function ajax(fn){
    setTimeout(() => {
        console.log('你好')
        fn()
    }, 1000);
}
//callback 会出现回调地狱
ajax(() => {
    console.log('执行结束')
})

输出结果

D:\Document\MoocMpvue\koa-demo>node asyncawait.js
你好
执行结束

通过回调函数可以解决函数执行顺序问题,但是会陷入回调地狱,造成代码层层嵌套,不容易阅读。

Promise

function delay(word){
    return new Promise((reslove, reject)=>{
        setTimeout(() => {
            reslove('hello' + word)
        }, 2000);
    })
}
delay("孙悟空")
    .then((word)=>{
        console.log(word)
        return delay('猪八戒')
    })
    .then((word)=>{
        console.log(word)
        return delay('沙悟净')
    })
    .then((word)=>{
        console.log(word)
    })

执行结果

D:\Document\MoocMpvue\koa-demo>node asyncawait.js
hello孙悟空
hello猪八戒
hello沙悟净

通过Promise消除了回调地狱,但是也会写很多的then,也不是很美观,终极解决方案async + await。

async + await

function delay(word){
    return new Promise((reslove, reject)=>{
        setTimeout(() => {
            reslove('hello' + word)
        }, 2000);
    })
}

async function start(){
    const word1 = await delay('孙悟空')
    console.log(word1)

    const word2 = await delay('猪八戒')
    console.log(word2)

    const word3 = await delay('沙悟净')
    console.log(word3)
}
start()

输出结果

D:\Document\MoocMpvue\koa-demo>node asyncawait.js
hello孙悟空
hello猪八戒
hello沙悟净

通过async + await代码变得整洁,和同步执行代码一样。

上一篇下一篇

猜你喜欢

热点阅读