2016-02-25 25 views
9

używam Bluebird magiępowinienem używać obietnicę dla mkdir

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

i używać

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

... 

Moje pytanie jest za pomocą następującego kodu (które działa) należy używać tego samego i jak Mówię o funkcji 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(); 
     } 
    }; 
} 

Moje pytanie brzmi: należy użyć obietnicę tutaj czy nie, co jest zalecane? kod działa zgodnie z oczekiwaniami ...

+1

Możesz po prostu użyć 'mkdirAsync', promisifyAll tworzy go dla ciebie. –

+0

@BenjaminGruenbaum -Dziękuję, ale jak mam to nazwać z chwytem i kolejną obietnicą wewnętrzną, czy możesz podać przykład? –

+0

Dokładnie tak samo jak w przypadku 'readdir' –

Odpowiedz

6

Promise upraszcza i ujednolica interfejsu. Albo .promisify() lub .promisifyAll() zrobi lewy.

Następnie można łańcuch wszystko tak:

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

Jednak w node.js, najważniejszą rzeczą jest to, aby nie blokować I/O. Nie ma znaczenia, czy używasz obietnicy lub zwykłej asynchronizacji/wywołania zwrotnego, o ile nie blokuje głównego wątku.

To dobrze, że masz kod synchroniczny w skrypcie, który chcesz uruchomić w powłoce, ale dla zwykłych aplikacji nigdy nie powinieneś celowo używać blokujących operacji we/wy.

+1

Całkowicie się zgadzam, obietnice IMHO zapewniają znacznie lepszą czytelność i łatwość konserwacji kodu, który okazuje się ważny w pracy zespołowej – maurycy

1
Promise.promisifyAll(fs); 

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

nadzieję, że to pomaga.

1

Zdecydowanie zaktualizuję twój kod, by był spójny. Jeśli jest to możliwe, połączenia mkdirAsync zamiast mkdir

przykład z kodu (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(); 
    });