2017-12-27 152 views
0

我有這個簡單的例子,我的控制器和預期的NodeJS - 異步/等待內部控制器

export let create = async (req: Request, res: Response) => { 

    console.log("START"); 
    await setTimeout(() => { 
     console.log("MIDDLE"); 
    }, 1000); 
    console.log("END"); 
    return res.json({ data: null }); 

}; 

輸出不起作用:開始,結束,MIDDLE

的處置:開始,中間,結束

+1

你期望什麼? –

+0

我覺得很明顯.... START ... MIDDLE ... END – Michalis

+1

'setTimeout'返回一個**數**,而不是一個承諾。只有當你「等待」一個承諾時,執行纔會真正「等待」。 –

回答

2

嘗試:

await new Promise(resolve => setTimeout(resolve, 1000))

0

您使用setTimeOut而不創建承諾對象,因此它正在等待setTimeOut值被返回(這是即時的),而不是等待承諾解決方案。這就是您的陳述不按照預期的方式工作的原因。你需要的是建立一個承諾:

function resolveAfterOneSecond(x) { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log("Middle"); 
     resolve(x); 
    }, 1000); 
    }); 
} 

async function f1() { 
    var x = await resolveAfterOneSecond(10); 
    console.log("End"); 
} 

console.log("Begin"); 
f1(); 

,然後設置你的函數,以等待承諾的回報,而不是setTimeout函數整數的回報。