return promise 和 return await promise
return promise 和 return await promise ,之前一直覺得兩者是一樣的。直到前幾天寫一段 puppeteer 的程式碼,一直報錯,怎麼都想不通。
後來才發現,原來是我為了防止記憶體洩露,把puppeteer的程式碼都包裹在了一個 try 當中,而 try 對應的finally 寫了 `page.close()`。這導致每次我在外層拿到的 promise 都是 reject 的狀態。
類似如下的demo程式碼:
const flag = true; const obj = { flag: true, content() { return new Promise((resolve, reject) => { setTimeout(() => { console.log('content') if (this.flag) { resolve('web page content') } else { reject(new Error('error happens')) } }) }) }, close() { console.log('close') this.flag = false; } } const f2 = async () => { try { return obj.content() } finally { obj.close() } } const f3 = async () => { try { return await obj.content() } finally { obj.close() } } const main = async () => { const content = await f3() console.log('got content') console.log(content) } main()
當呼叫 f3的時候,拿到的就是resolve的結果,呼叫 f2的時候,則是reject的結果。
因為 f3 return 的是字串,而f2是把promise返回了出去。
我覺得吧,以後就統一寫 await promise 好了。