|
是一个用同步的思维来解决异步问题的方案,当前端接口调用需要等到接口返回值以后渲染页面。
需要注意的是: 1.await 必须出现在 async 函数内部,不能单独使用。 2.async -await 是 promise 的语法糖,它还是使用了 Promise,所有不能完全代替 Promise。 3.async -await 使异步代码看起来像同步代码一样操作,这也是他的特点。 async -await 的使用方法如下: 1.定义 async 需要定义一个有 async 关键字的函数,async 需要放在函数的最前面,用于表示该函数是一个异步函数,async 本身的意思就是异步, async 函数本身返回的就是一个 promise 对象,如果 async 关键字函数返回的不是promise,则会自动用Promise.resolve();包装。 代码如下: async function demo(){
//await 等待方式
}2.使用 Promise需要定义一个返回 Promise 的函数。 resolve 和 reject 的作用是将Promise中的函数要传递的值,前者表示执行成功可返回解析后的 promise 对象,后者表示执行失败可抛出带有失败原因的 promise 的对象。 代码如下: function a1(){
return new Promise((resolve,reject)=>{
//执行的操作
})
}3.使用 await需要在 async 函数里使用 await 等待,那它在等待什么呢?它等待的是右侧表达式的结果,这个结果可以是 Promise 对象或者其他值。 如果不是一个 promise 对象,那么 await 表达式的运算结果就是右边的值, 如果是一个 promise 对象,那么它就会阻塞后面的代码,等待 promise 传过来的 resolve 的值,然后作为结果,这里返回的则为一个 promise 对象。 注:await 只能和 async 一起使用. 代码如下: async function demo(){
var a = await a1() //申明await等待
}接下来则是执行顺序: 在遇到 await 过后会阻塞后面的代码,所以会先执行 async 外面的同步代码,同步代码执行完成过后,再返回到 async 内继续执行 await 后面的代码。 示例代码: //asnyc - await 异步处理方法
router.get("/index.html",function (req,resp){
getData(req,resp);
});
async function getData(req,resp){
let bannerData = await getLunBo();
resp.render("index",{banner:bannerData});
}
function getLunBo(){
return new Promise((resolve,reject)=>{
let sql ="select * from banner where KeyName in ('isLunBo')";
DB.query(sql,[],function (err,data) {
if (err){
reject(err);
}else {
resolve(data);
}
})
})
}async -await 的优缺点: 优点: 相对于 promise 来说,async -await 的处理 then 的调用链,代码要比 promise 更加清晰,会更容易阅读。 缺点: 因为 await 执行会阻塞后面代码,所以滥用await会到导致性能降低。 总的来说 async 是用于申明一个异步 function ,而 await 用于等待一个异步方法执行完成,而这个异步方法的实现需要用到Promise。 |
|