2016-09-09 46 views
0

我有一個主要功能,用於執行特定的查詢和解析響應。該函數的第一步是驗證賦予該函數的參數。然後我將生成查詢,簽名併發送。最後,我會處理回覆。NodeJS結合鏈接同步和異步功能,然後

對於發送查詢,我想使用承諾模式。我想要的是主要功能會返回一個承諾。問題是,大多數函數是同步的而不是異步的,所以我不應該使用promise。我想要的是這樣的:

return this.validateQueryAttributes(attributes) 
    .then(generateQuery) 
    .then(signQuery) 
    .then(sendQuery) 
    .then(handleResponse); 

問題是,第一個函數沒有返回一個promise。所以我不能將它與其他功能連接起來,因爲當時的模式期望得到承諾。另外,我有一個.catch函數,我想用它來捕獲可能發生在我打電話的任何函數中的錯誤條件。如果我不會將第一個函數與其他函數鏈接起來,那麼在第一個函數中發生的錯誤將不會被捕獲?

+2

是的,但是如果函數本身是同步的,你永遠不應該返回一個promise。您應該只使用承諾異步功能。 –

+0

這是否是這種情況下的最佳做法?如果您認爲是,請將其作爲答案發布。以及如何使這個異步包裝:) –

回答

1

您可以使用Promise.resolve()開始承諾鏈,然後使用同步(也可能是投擲)功能then處理程序:,

return Promise.resolve(attributes) 
    .then(this.validateQueryAttributes) // you might need .bind(this) 
    .then(generateQuery) 
    .then(signQuery) 
    .then(sendQuery) 
    .then(handleResponse); 

或者,如果您使用的是庫如藍鳥,你也可以使用Promise.tryPromise.method捕捉同步異常。