2016-02-25 12 views
9

ich die drossel MagieSollte ich Versprechen für mkdir

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

und

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

... 

Meine Frage verwenden verwenden ist für den folgenden Code (der Betrieb) sollte ich das gleiche verwenden und wie Ich spreche über die mkdir Funktion.

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(); 
     } 
    }; 
} 

Meine Frage ist, sollte ich versprechen hier verwendet wird oder nicht, was empfohlen? Der Code funktioniert wie erwartet ...

+1

Sie können einfach 'mkdirAsync' verwenden, promisifyAll erstellt es für Sie. –

+0

@BenjaminGruenbaum -Thanks aber wie soll ich es mit dem Fang und dem nächsten Innenversprechen bezeichnen, kannst du bitte ein Beispiel geben? –

+0

Genau wie Sie es für 'readdir' –

Antwort

6

A Promise vereinfacht und vereinheitlicht die Schnittstelle. Entweder .promisify() oder .promisifyAll() wird den Trick machen.

Dann können Sie Kette alles wie folgt aus:

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

jedoch in node.js, das Wichtigste ist, die E/A zu blockieren. Es spielt keine Rolle, ob Sie eine Promise oder einen regulären Async/Callback verwenden, solange der Hauptthread nicht blockiert wird.

Es ist in Ordnung, synchronen Code im Skript zu haben, das Sie in der Shell ausführen möchten, aber für normale Anwendungen sollten Sie niemals absichtlich blockierende E/A-Operationen verwenden.

+1

Ich stimme völlig zu, IMHO verspricht viel bessere Lesbarkeit und Wartbarkeit für den Code, der in der Teamarbeit wichtig ist – maurycy

1
Promise.promisifyAll(fs); 

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

Hoffnung, das hilft.

1

Ich würde auf jeden Fall Ihren Code aktualisieren, um konsistent zu sein. Wenn möglich, rufen mkdirAsync anstelle von mkdir

Beispiel (von OPs code):

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(); 
    });