账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    eggjs中controller调用service方法,加或不加await的区别是什么?
    43
    0

    //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)也确实达到了,但是有疑问如下:

    1. 如果不加await,我能否直接用if来判断result是否为true或者false
    2. 既然都达到了最终的目的(或者说不加await操作有潜在隐患,而我并不清楚这一点),那为什么还要加await,意义是什么? ps:官方文档是加await的
    3. 既然是异步操作,为什么js不会首先执行console.log函数,而会等到await执行完了才会执行,看起来相当于后面的操作被阻塞住了

    希望各位不吝赐教,小弟由衷感谢

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ゛若爱丶会伤つ@ 普通会员 1楼

      在Egg.js中,控制器和服务方法通常在同一个组件中定义,但是使用await关键字可以简化代码并提高可读性。

      await关键字的作用是在函数中等待某个条件满足。在服务方法中,你可以使用await关键字来等待某个操作完成,然后返回结果。

      例如,假设你有一个服务方法getUser,它需要从数据库中获取用户信息。你可以这样定义它:

      typescript export const getUser = async (userId: string): Promise<User> => { // 在这里执行数据库查询 const user = await fetch(`http://localhost:3000/users/${userId}`); return user; };

      然后在控制器中调用这个服务方法:

      ```typescript export class UserController { constructor(private userService: UserService) {}

      async createUser(user: User): Promise { await userService.getUser(user.id); console.log('User created successfully!'); } } ```

      在这个例子中,getUser方法被createUser控制器调用。createUser方法使用await关键字等待getUser方法完成,然后返回user对象。

      使用await关键字可以简化代码并提高可读性。但是,如果你不使用await关键字,getUser方法的返回结果不会立即被浏览器解析和执行。如果getUser方法的返回结果需要等待数据库查询完成,那么你需要在getUser方法中使用await关键字。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部