2016-12-28 139 views
5

我不知道SO是否適合這樣的問題。使用'承諾'與不使用'承諾':在哪些情況下?

我知道Promises,我在Node/Express環境中使用它們在查詢數據庫(=等待DB答案,然後執行某些操作)時「修復」Node的異步行爲。

但是,我使用它們越多,我不知道什麼時候不使用它們。

例如,我寫了這樣的一段代碼(對於本地腳本查詢Google Matrix API)...

.... 
for (var i = 0; i < rows.length; i++) { // loop over a CSV file by line 
    var cell = rows[i].split(/;/) 
    var origin = cell[1] 
    var destination = cell[2] 
    var id = cell[0] 
    Promise.all([origin, destination, id]).then((p) => {} 
... 

我不知道,如果使用這裏Promise.all有道理可言..

是否有規則知道?我沒有得到的行爲?

換句話說,我什麼時候知道我的腳本運行function沒有正確的參數(argument從另一個function不是「超過」返回)有一個「風險」...?

謝謝。

+6

您使用承諾來幫助處理異步進程。如果沒有異步,那麼就沒有必要使用promise。在你的例子中,'origin','destination'和'id'是**串**,不是承諾。將這些值傳遞給'Promise.all'沒有任何意義。我認爲你應該繼續學習承諾,以便你真正理解他們正在解決哪個問題。那麼「何時不使用它們」這個問題應該是顯而易見的。 –

+0

您不會在上面的情況下使用Promises,因爲它不是異步的。您通常會在需要回調或等待某些異步行爲完成時使用promise。 –

+0

它沒有任何意義,'Promise.all(list)'返回一個承諾,一旦所有的承諾在list上完成,但你傳遞一個單元格列表?文本?當然不是承諾。 – ranisalt

回答

2

當你有完全同步的代碼(沒有異步操作,你試圖跟蹤完成),你不想使用承諾。

試圖用承諾與同步代碼只增加了不必要的複雜的代碼的邏輯和減慢你的代碼的執行。與所有的同步代碼,還有什麼等待的完成或與這樣你就可以只執行你的代碼,並立即有結果完成協調。添加承諾會使您的代碼不必要地複雜化。

另外,Promise.all()希望你傳遞一個promise數組,而不是像你這樣做的值數組,除了是不必要的,你所做的也是不正確的。

所以,真的沒有理由不只是這樣做:

.... 
for (var i = 0; i < rows.length; i++) { // loop over a CSV file by line 
    var cell = rows[i].split(/;/) 
    var origin = cell[1] 
    var destination = cell[2] 
    var id = cell[0] 
    // operate on id, destination and origin here 
    // no need to wait on a promise before doing so 
} 
... 

承諾將與異步操作,如數據庫操作,文件操作,網絡操作,定時操作,等等......你可以用使用它們來知道何時完成單個異步操作或者協調多個操作(其中一些是異步的)。

3

我通常只使用承諾,如果我使用的是一個異步過程,例如從數據庫中獲取數據的調用。如果你沒有處理異步過程,我不能想到你需要使用承諾的情況。

1

一般不要使用本地答應自己,你使用的承諾,因爲你目前使用需要一些asynchonous過程:

  • HTTP請求的客戶端
  • 數據庫/其他請求,服務器端

通常你使用的連接器/庫已經給你一個Promise或者一個回調,你可以在這個Promise或回調中解決諾言,以便在任何地方使用promise。

另一個非常特定類型的異步處理的是,當你的客戶端做一些重的東西(通常它不應該!),你需要使它像它在後臺運行,並以異步方式解決。

您可以使用承諾並在完成時解決。

請參閱SO's post如果您不明白我的意思是「在後臺運行」,因爲Javascript是單線程的,沒有這樣的事情,它只是模擬它。