Mentre la risposta di Neil è abbastanza accurata, le cose potrebbero cambiare in futuro con l'avvento di funzioni asincrone in ECMAScript 8. Il supporto per le funzioni asincrone è stato aggiunto nel nodo 7.6 e nel nodo 8 (È). Inoltre, il Nodo 8 ha aggiunto la funzione util.promisify
che apre molte potenzialità.
Lanciare un errore in una funzione asincrona equivale a rifiutare una promessa. Invece di avere diversi modi di gestire gli errori ( catch
per le funzioni sincrone, (err, ...args)
per i callback e .catch()
per le promesse), il codice asincrono cerca sincrono e il costrutto try / catch può essere usato.
Ad esempio:
Utilizzo delle promesse, gestione degli errori asincroni con .catch
e errori di sincronizzazione con try / catch:
const promisify = require('util').promisify
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)
readFileAsync('foo.txt', {encoding: 'utf8'})
.then(data => {
console.log('CONTENT:', data)
try {
let moreOtherStuff = syncThing(data)
return Promise.resolve(otherSyncThing(moreOtherStuff))
} catch (err) {
return Promise.reject(err)
}
})
.catch(err => console.error(err))
Utilizzo delle funzioni asincrone, gestione degli errori con try / catch:
const promisify = require('util').promisify
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)
(async () => {
try {
let data = await readFileAsync('foo.txt', {encoding: 'utf8'})
console.log('CONTENT:', data)
let moreOtherStuff = syncThing(data)
return otherSyncThing(moreOtherStuff)
} catch (err) {
console.error(err)
throw new Error(err)
}
})()
Come puoi vedere, il codice usa lo stesso blocco try / catch per gestire l'errore (indipendentemente dal fatto che ciò sia desiderabile dipende dal caso d'uso e dalle preferenze personali). Indipendentemente da ciò, il codice sembra più sincrono quando viene letto dall'alto verso il basso.
Oltre a tutto questo, le dichiarazioni try / catch / finally non potevano essere ottimizzate precedente alla V8 5.3 (il motore JavaScript utilizzato nel Nodo 7.x), quindi le prestazioni potrebbero essere un fattore. Tuttavia, questo non dovrebbe più essere il caso, visto che ora il motore è in grado di ottimizzare questi blocchi.