eggjs中controller调用service方法,加或不加await的区别是什么?
//test/service/role.js service代码如下
async deleteRoleById(id){
const{app} = this;
try {
await conn.delete('role', {
id: id,
});
} catch (error) {
return false;
}
return true;
}
//test/controller/role.js controller代码如下
async roleDeleteDo(){
const{ctx} = this;
const ids_str = ctx.request.body.ids_str;
//await 加或不加??
const result = await ctx.service.role.deleteRolesByIds(ids_str);
console.log(result);
if (result){
//返回操作正确的提示
ctx.body = ctx.ResultUtil.success();
}else{
//返回错误操作的提示
ctx.body = ctx.ResultUtil.error(config.werror.ERR_ROLE_DELETE);
}
return;
}
当controller利用 await ctx.service.role.deleteRolesByIds(ids_str)
调用service时,console.log(result);
的打印结果为true或者false,而如果不加 await
,打印结果则为 Promise {true(或false)}
我知道async函数返回结果是一个Promise对象,而且程序的目的(删除role)也确实达到了,但是有疑问如下:
- 如果不加
await
,我能否直接用if来判断result是否为true
或者false
- 既然都达到了最终的目的(或者说不加await操作有潜在隐患,而我并不清楚这一点),那为什么还要加await,意义是什么? ps:官方文档是加await的
- 既然是异步操作,为什么js不会首先执行
console.log
函数,而会等到await执行完了才会执行,看起来相当于后面的操作被阻塞住了
希望各位不吝赐教,小弟由衷感谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
await后面是有异步请求的话,不加await获取不到result
async,await是generator的语法糖,await是阻塞进程,执行完await后面的才会执行下一步
举例,你要用service的getUserInfo()方法获取用户的信息userInfo
const userInfo = await service.getUserInfo()
这种情况下必须要加await,否则异步结果还没出来就给userInfo赋值了,会报错
但如果你要一番操作后删除这个用户,并且不需要知道结果怎么样,就可以不加
service.delUser()
如果你出门前让你妈把车钥匙拿来,她不拿来你没法走,就要加await,等她做完你再进行下一步
如果你出门跟你妈喊一嗓子帮我晒衣服啊,至于你妈听见没,晒没晒你都无所谓,就可以不加await