async,await,promise,Generator

async 函数,await语句,promise对象,以及Generator

代码1


async function test(){

    console.log("IN ASYC")

    console.log(await "plain expression1");

    console.log(await "plain expression2");

    return "async test function end!"



}

console.log(test().then((msg)=>{console.log(msg)}));

console.log("Module end!");

输出:


IN ASYC

Promise {  }

Module end!

plain expression1

plain expression2

async test function end!

代码2


async function test(){

    console.log("IN ASYC")

    console.log(await new Promise(function(resolve){

            console.log("in await with real promise")

            resolve("run resolve in a await!");

        }

    ));



    console.log(await "plain expression1");



    return "async test function end!"



}

console.log(test().then((msg)=>{console.log(msg)}));

console.log("Module end!");

输出:


IN ASYC

in await with real promise

Promise {  }  //console.log(test().then((msg)=>{console.log(msg)}));

Module end!

run resolve in a await!

plain expression1

async test function end!

async函数整体介绍

  • 调用async函数返回的是一个Promise对象

  • 运行async函数时,其内部抛出错误,若不被有效的try...catch,会导致该Promise对象立刻变为reject状态。可以被promise对象的catch方法接收。

  • async函数内的返回值,就是promise对象promise_value,可被promise链的then方法接收。

promise介绍

  • new promise(func)构造promise对象时,func是立即同步执行的,其后的then把promise_status改变后使用的回调函数放入事件循环,供异步调用使用(被onFullFill或onReject事件触发)。

  • then(onFullFillFunc,onRejectFunc)调用返回一个新的promise对象。

  • promise函数链中,then方法调用中第一个函数参数的返回值,就是then方法返回的promise对象的promise_value。

await介绍

  • await 命令后必需是一个Promise对象,若不是(是一个普通表达式),则会被自动转成一个立即resolve的Promise对象即:Promise.resolve(expression),表达式的值就是promise_value。

  • await后的promise对象初始化完成后,让出线程,中断async函数的执行。模块继续向下运行,此处类似generator函数的yield。

  • 模块执行完毕。进入事件循环then队列,中断的async函数继续执行,await命令返回promise_value,async函数内部继续执行,直到遇到下一个await或者结束。

async和 Generator ,二者形式上十分相近,* 对应 async,yield 对应 await。

但比起 Generator 来, async 函数似乎更「智能」一些,一旦执行 async 函数,里面的代码都会自动执行,虽然遇到 await 也会停,但是停了之后自己又会自动去执行,而不像 Generator 每次暂停都需要手动执行 generatorFun().next() 才能继续。

虽然 async 更加「智能」了,但是自然不如 Generator 灵活,因为 async 实际是由 Generator 和 Promise 一起实现的语法糖,对 Generator 加了限制而成的 async 在灵活性自然比不上什么限制都没有的原本 Generator,既然 Generator 可以和 Promise 组合而实现 async,那么必然就可以和其他的什么组合而成另外的一些东西,这就需要看程序员的脑洞了。

你可能感兴趣的:(async,await,promise,Generator)