2013-06-16 12 views
30

Non riesco a rilevare ENOENT di fs.createReadStream(). È una funzione asincrona, che genera un'eccezione in una catena di chiusura diversa?è ENOENT da fs.createReadStream non acquistabile?

$ node -v 
v0.10.9 
$ cat a.js 
fs = require('fs') 

try { 
    x = fs.createReadStream('foo'); 
} catch (e) { 
    console.log("Caught"); 
} 

$ node a.js 

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: ENOENT, open 'foo' 

Mi aspetto che venga stampato "Caught" anziché lo stack di errori!

risposta

43

fs.createReadStream è asincrono con lo stile dell'emettitore di eventi e non genera eccezioni (che hanno senso solo per il codice sincrono). Invece emetterà un evento di errore.

var fs = require('fs') 

var stream = fs.createReadStream('foo'); 
stream.on('error', function (error) {console.log("Caught", error);}); 
stream.on('readable', function() {stream.read();}); 
+3

Suppongo che tu stia dicendo che l'oggetto flusso viene restituito in modo sincrono, ma l'apertura del suo file avviene in modo asincrono con l'emissione di eventi. Non c'è possibilità che l'evento di errore venga emesso prima che 'stream.on ('error', ...)' abbia effetto? Questo è quello che vedo se digito questo in REPL del nodo una riga alla volta. –

+3

Sì, si può essere certi che il tick corrente verrà completato prima che si verifichi un evento. Quindi, finché leghi subito i tuoi gestori, va tutto bene. –

+0

Hmm questo è un comportamento davvero confuso! – UpTheCreek

Problemi correlati