2017-08-06 133 views
3

我開始與異步/等待在打字稿的事情,我對此有一些問題。我寫了這個函數從Blob獲取ArrayBuffer。使用無極與異步/等待

async function readAsArrayBuffer(blob: Blob): Promise<ArrayBuffer> { 
    return new Promise<ArrayBuffer>((resolve, reject) => { 
     let reader = new FileReader(); 
     reader.addEventListener('load', e => resolve((<FileReader>e.target).result)); 
     reader.addEventListener('error', e => reject((<FileReader>e.target).error)); 
     reader.readAsArrayBuffer(blob); 
    }); 
} 

所以......

  1. 我真的需要async關鍵字此功能之前?我想,它什麼也不做......
  2. 我應該建立在承諾執行程序功能範圍或readAsArrayBuffer範圍國家級新的FileReader? (...或不要緊?)
  3. 我寫了什麼是嵌套在嵌套函數功能兩種功能。難道我做錯了什麼? :-)

回答

3

我真的需要異步關鍵字此功能之前?我想,它什麼也不做......

都能跟得上。如果在函數體內使用await,則只需要使用async關鍵字。

我應該在Promise executor函數作用域還是readAsArrayBuffer作用域級別創建新的FileReader? (...或不重要?)

我建議將大部分實際代碼保留在執行程序函數中。其優點是,如果你有一個同步異常(例如,如果new FileReader()是到throw建設),執行器將趕上並把它變成一個異步的承諾拒絕。如果你把它放在執行器函數之外,那麼你的函數會拋出一個同步異常。這會讓你感到困惑,因爲你必須分別處理同步和異步異常。

我寫的是嵌套在函數中的兩個函數。難道我做錯了什麼? :-)

這很好。當你在一個非promise API中編寫一個promise包裝時,這是一個很常見的模式。優點是你現在可以使用這個包裝await,並避免在代碼的其他部分嵌套函數。 :-)

+0

@trincot Yup,[參見MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise):_「如果錯誤被拋出執行器函數,promise被拒絕,執行程序的返回值被忽略。「_注意,當你從開發控制檯運行這個函數時,Chrome會記錄」Uncaught(in promise)my error「,但這實際上是因爲缺省未被捕獲的承諾拒絕處理程序。嘗試在它周圍放置一個'try..catch'來查看與僅僅拋出我的錯誤相比的區別。 –

+0

確實,你是對的。我在FireFox中看到的輸出不如Chrome中清晰。 – trincot

3
  1. 我真的需要異步關鍵字此功能之前?我想,它什麼也不做......

沒有,你只需要async當函數使用await關鍵字,這將使該函數異步執行,這是不是在你的函數的情況:它執行同步完成。異步部分僅用於觸發回調,而不是關鍵字async

  • 我應該在無極執行程序功能範圍或在readAsArrayBuffer範圍級別創建新的FileReader? (...或不要緊?)
  • 最佳做法是定義是作業所需的最小範圍內的變量。雖然它會以任何方式工作,但您現在擁有更好的體驗。

    1. 我寫的是嵌套在函數中的兩個函數。難道我做錯了什麼? :-)

    沒什麼問題。