Promise 面试题 async-await遇到的坑

134 阅读1分钟

Promise 面试题 async-await

let app = ()=>{

 return new Promise((*resolve*) => {

  console.log(2);

  resolve("app执行完毕");

 }).then((*data*) => {

  console.log(4);

  return *data*
 })
} 

async function a(){

 console.log(1);

 let data = await app()

 console.log(3);

 console.log(data);

}


a().then((*result*) => {

  console.log("最后的结果");

})


console.log("out");
结果:12out43app执行完毕最后的结果结果: 1 2 out 4 3 app执行完毕 最后的结果

ECMAScript 6 入门》中对async函数的定义:

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

async函数遇到await会先返回,即在整个async函数体中的语句保持同步,但是async函数外的语句会仍然会js原本的执行顺序保持同异步。

即例子的a函数内的log(3)会跟整个保持同步,等待app()完成。跟a()同层的console.log("out")语句不会跟a()内的app()保持同步。

当a执行到await时,进一步到app的than调用时就暂时挂起a函数,接着去执行a函数体之外的、后面的语句。

总结:async函数只保证的函数体的语句是同步执行,整个js的执行线程仍然是异步的