2017-08-12 20 views
2

我是一個新手承諾是一個完整的回調選擇?

我對使用promise而不是回調感到困惑。

我何時需要存在?

什麼是回調的屬性,迫使我使用它,而不是承諾?

+0

兩者都用來處理異步編程。據我所知,使用promise的一個好處是避免回調地獄。請參閱https://javascript.info/promise-chaining –

+1

如果沒有「回調」,承諾就無法存在 - 它們的構造函數和它們的'then'方法會帶上一些。 – Bergi

+0

@Bergi ......好吧,再加上異步/等待,這些對你來說都是隱藏的。 –

回答

1

MDN具有承諾的一個很好的定義:

甲諾表示[酮]異步操作的最終完成(或失敗),並且其結果值。

承諾不是關於重複發生的事件,它通常由您作爲回調傳遞的函數處理。

在許多情況下,回調的API可重構與承諾的工作:

request('file.txt', function (err, result) { 
    if (err) { 
    console.error('An error occurred:', err); 
    } 
    console.log(result); 
}); 

使用的承諾,這可以被改寫爲:

request('file.txt') 
    .then(result => console.log(result)) 
    .catch(err => console.log('An error occurred:', err)); 

然而,一個承諾可以解決只有一次。上面代碼片段中的request函數可以封裝在承諾API中,因爲回調只能執行一次。但是,如果你處理多個事件與一個回調函數,它很難得到改寫使用承諾代碼:

server.on('request', function (req, res) { 
    // ... 
}); 

你會如何改寫呢?

Observables將是解決這個問題的方法之一。它們允許您對多個異步操作做出反應。如果你開始做一些有關可觀測量的研究,你將會看到這個表格:

|   | Singular  | Plural   | 
|----------|----------------|-------------------| 
| Spatial | Value   | Iterable<Value> | 
| Temporal | Promise<Value> | Observable<Value> |