2016-02-25 26 views
9

Io uso la magia BluebirdDevo usare promessa per mkdir

var fs = Promise.promisifyAll(require('fs')); 

e utilizzare

fs.readdirAsync(dest).then(function (val) { 
     return val; 
}).then(function (file) { 

... 

La mia domanda è per il seguente codice (che sta lavorando) dovrei usare lo stesso e come Sto parlando della funzione mkdir.

function createDir(folder) { 
    return function (req, res, next) { 
     if (typeof require.cache.per === 'undefined') { 
      require.cache.per = {}; 
      require.cache.per.mk = false; 
     } 
     if (!require.cache.per.mk) { 
      fs.mkdir(folder, function (e) { 
       if (!!e && e.code !== 'EEXIST') { 
        console.log('Error to create folder: ' + err); 
       } 
       require.cache.per.mk = true; 
       next(); 
      }); 
     } else { 
      next(); 
     } 
    }; 
} 

mia domanda è devo usare promessa qui o no, ciò che è raccomandato ? Il codice funziona come previsto ...

+1

Si può semplicemente usare 'mkdirAsync', promisifyAll lo crea per te. –

+0

@BenjaminGruenbaum -Grazie ma come dovrei chiamarlo con la presa e la prossima promessa interna, puoi fornire un esempio? –

+0

Esattamente come hai fatto per 'readdir' –

risposta

6

Una promessa semplifica e unifica l'interfaccia. O .promisify() o .promisifyAll() farà il trucco.

Quindi è possibile concatenare tutto in questo modo:

fs.mkdir(dir) 
    .then(function success(dir) { 
     ... 
    }) 
    .catch(function failure(err) { 
     ... 
    }) 
    .finally(function() { 
    }); 

Tuttavia nel node.js, la cosa più importante è di non bloccare l'I/O. Non importa se usi una Promessa o una normale asincrona/richiamata, purché non blocchi il thread principale.

È normale disporre di codice sincrono nello script che si desidera eseguire nella shell, ma per le normali applicazioni non si dovrebbe mai utilizzare apposta le operazioni di I/O.

+1

Sono assolutamente d'accordo, le promesse di IMHO forniscono una leggibilità e una manutenzione molto migliori per il codice che si dimostra importante nella collaborazione di squadra – maurycy

1
Promise.promisifyAll(fs); 

return fs.mkdirAsync(dir1) 
    .then(function() { 
    return fs.mkdirAsync(dir2); 
    }) 
    .then(function() { 
    return fs.mkdirAsync(dir3); 
    }) 

Spero che questo aiuti.

1

Definirei sicuramente il codice in modo coerente. Se possibile, chiamare mkdirAsync anziché mkdir

Esempio (dal codice di OP):

var fs = Promise.promisifyAll(require('fs')); 

// ... 

fs.mkdirAsync(folder) 
    .catch({ code: 'EEXIST' }, function(e){ 
     // don't care about this error code 
    }) 
    .catch(function(e) { 
     console.log('Error to create folder: ' + e); 
    }) 
    .then(function(){ 
     require.cache.per.mk = true; 
     next(); 
    });