2017-04-22 5 views
1

Ich habe angefangen zu spielen mit async/erwarten in der neuesten Version von Node und ich renne in ein Problem, wenn Sie versuchen, etwas in einem fangen warten.Auswirkungen der Verwendung erwarten in einem Fang

Lassen Sie uns sagen, dass ich die folgende Funktion haben zu überprüfen, um zu sehen, ob ein Verzeichnis existiert und erstellen Ordner nach Bedarf, wenn nicht:

const Promise = require("bluebird"); 
const fs = Promise.promisifyAll(require("fs")); 
const path = require("path"); 

async function ensureDirectoryExists(directory) { 
    try { 
     console.log("Checking if " + directory + " already exists"); 
     await fs.openAsync(directory, "r"); 
    } catch (error) { 
     console.log("An error occurred checking if " + directory + " already exists (so it probably doesn't)."); 
     let parent = path.dirname(directory); 

     if (parent !== directory) { 
      await ensureDirectoryExists(parent); 
     } 

     console.log("Creating " + directory); 
     await fs.mkdirAsync(directory); 
    } 
} 

Wenn ich es auf die folgende Weise nennen (es einen Verzeichnispfad bereitstellt, in dem keiner der Ordner existiert), bekomme ich die erwartete Ausgabe ("Sichergestellt, dass das Verzeichnis existiert." kommt zuletzt).

async function doSomething(fullPath) { 
    await ensureDirectoryExists(fullPath); 
    console.log("Ensured that the directory exists."); 
} 

jedoch, wie ich es verstehe, gibt jede Asynchron-Funktion ein Versprechen, so dachte ich folgend würde auch funktionieren:

function doSomething2(fullPath) { 
    ensureDirectoryExists(fullPath).then(console.log("Ensured that the directory exists.")); 
} 

In diesem Fall allerdings die dann gleich nach dem ersten ausgeführt wird Rufen Sie fs.openAsync auf, obwohl ein Fehler aufgetreten ist und der Rest des Codes weiterhin wie erwartet ausgeführt wird. Versichert sureDirectoryExists kein Versprechen, weil es eigentlich nichts explizit zurückgibt? Ist alles wegen des Wartens im Catch durcheinander und es scheint nur zu funktionieren, wenn es von doSomething aufgerufen wird?

Antwort

0

Sie rufen .then auf Ihr Versprechen falsch an; es erwartet eine Funktion die console.log nennen würde:

ensureDirectoryExists(fullPath) 
    .then(function() { // <-- note function here 
    console.log("Ensured that the directory exists."); 
    }); 

oder kurz, mit arrow functions:

ensureDirectoryExists(fullPath) 
    .then(() => console.log("Ensured that the directory exists.")); 

Wenn Sie es in einer Funktion wie diese nicht wickeln, wird console.log(...) ausgewertet werden und sofort ausgeführt werden (daher kann es protokollieren, bevor ensureDirectoryExists abgeschlossen wurde). Wenn Sie stattdessen eine Funktion angeben, kann das Versprechen diese Funktion aufrufen, wenn die Async-Funktion abgeschlossen ist.

+0

Ja, das würde es erklären :) –

Verwandte Themen