在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ eggjs中controller調(diào)用service方法,加或不加await的區(qū)別

eggjs中controller調(diào)用service方法,加或不加await的區(qū)別是什么?

//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{
            //返回錯(cuò)誤操作的提示
            ctx.body = ctx.ResultUtil.error(config.werror.ERR_ROLE_DELETE);
        }
        return;
    }

當(dāng)controller利用 await ctx.service.role.deleteRolesByIds(ids_str) 調(diào)用service時(shí),console.log(result);的打印結(jié)果為true或者false,而如果不加 await,打印結(jié)果則為 Promise {true(或false)}

我知道async函數(shù)返回結(jié)果是一個(gè)Promise對象,而且程序的目的(刪除role)也確實(shí)達(dá)到了,但是有疑問如下:

  1. 如果不加await,我能否直接用if來判斷result是否為true或者false
  2. 既然都達(dá)到了最終的目的(或者說不加await操作有潛在隱患,而我并不清楚這一點(diǎn)),那為什么還要加await,意義是什么? ps:官方文檔是加await的
  3. 既然是異步操作,為什么js不會首先執(zhí)行console.log函數(shù),而會等到await執(zhí)行完了才會執(zhí)行,看起來相當(dāng)于后面的操作被阻塞住了

希望各位不吝賜教,小弟由衷感謝

回答
編輯回答
舊顏

await后面是有異步請求的話,不加await獲取不到result
async,await是generator的語法糖,await是阻塞進(jìn)程,執(zhí)行完await后面的才會執(zhí)行下一步

2018年5月18日 02:53
編輯回答
夏木

舉例,你要用service的getUserInfo()方法獲取用戶的信息userInfo

const userInfo = await service.getUserInfo()

這種情況下必須要加await,否則異步結(jié)果還沒出來就給userInfo賦值了,會報(bào)錯(cuò)

但如果你要一番操作后刪除這個(gè)用戶,并且不需要知道結(jié)果怎么樣,就可以不加
service.delUser()

如果你出門前讓你媽把車鑰匙拿來,她不拿來你沒法走,就要加await,等她做完你再進(jìn)行下一步

如果你出門跟你媽喊一嗓子幫我曬衣服啊,至于你媽聽見沒,曬沒曬你都無所謂,就可以不加await

2017年8月31日 16:54