2017-03-22 1 views
1

Ich bin neu bei node.js und versuche mich durchzusetzen verspricht. Ich versuche, Inhalt von einer Datei zu lesen, ein Versprechen und Inhalt der Datei zurückzugeben. Ich war bisher in der Lage, den Inhalt der Datei zu lesen und sie auf meiner Konsole auszudrucken und ein Versprechen abzugeben. Ich möchte auch den Inhalt der Datei zurückgeben.Versprechen und Inhalt zurückgeben (kann viele sein)

Hier ist mein Code so weit.

function() { 
return fs.exists(listFile).then(function (exists) { 
    if(exists) { 
     return fs.readFile(listFile).then(function(response) { 
      console.log(response.toString()); 
     }).catch(function(error) { 
      console.error('failed to read from the file', error); 
     }); 
    } 
}).catch(function(err) { 
    console.error('Error checking existence', err) 
}); 
}; 
+0

Antwort ähnliches Problem: http://stackoverflow.com/a/39761387/4175944 – Christopher

+3

Sie Drossel verwenden? 'fs.exists()' gibt keine Promise zurück. – jessegavin

+0

Mögliches Duplikat von [Wie bekomme ich den Wert eines Versprechens korrekt zurück?] (Http://stackoverflow.com/questions/39761302/how-to-correctly-get-the-value-returned-from-a-promise) – Christopher

Antwort

1

fs.readFile (listFile) gibt ein Versprechen zurück. Deshalb können Sie die Methode ".then()" dahinter ketten. Es gibt wirklich nichts, was Sie an dieser Stelle zurückgeben können. Außerdem würde es an die Callback-Funktion zurückgegeben, die Sie an ".then" in der zweiten Zeile übergeben haben.

Um auf den Inhalt der Datei zuzugreifen, müssen Sie eine andere Funktion mit dem Inhalt der Datei aufrufen, wo Sie sie auf der Konsole drucken.

function() { 
return fs.exists(listFile).then(function (exists) { 
    if(exists) { 
     fs.readFile(listFile).then(function(response) { 
      console.log(response.toString()); 
      handleFileContents(response.toString()); 
     }).catch(function(error) { 
      console.error('failed to read from the file', error); 
     }); 
    } 
}).catch(function(err) { 
    console.error('Error checking existence', err) 
}); 
}; 

function handleFileContents(content) { 
    // ... handling here 
} 
+1

@baao, OP verwendet 'mz/fs', die Versprechen verspricht. – zzzzBov

+0

Ahhhhhhh @zzzzBov, vielen Dank für die Klarstellung – baao

+0

@Lenco Wie löst das mein Problem, dass ich sowohl Inhalte als auch ein Versprechen abgeben muss? Ich werde den Inhalt der Datei an ein anderes Versprechen übergeben müssen. –

0

Sie können nicht return der Inhalt der Datei selbst, sie werden asynchron abgerufen. Alles, was Sie tun können, ist ein Versprechen für den Inhalt zurück:

function readExistingFile(listFile) { 
    return fs.exists(listFile).then(function (exists) { 
     if (exists) { 
      return fs.readFile(listFile).then(function(response) { 
       var contents = response.toString(); 
       console.log(contents); 
       return contents; 
//    ^^^^^^^^^^^^^^^^ 
      }).catch(function(error) { 
       console.error('failed to read from the file', error); 
       return ""; 
      }); 
     } else { 
      return ""; 
     } 
    }).catch(function(err) { 
     console.error('Error checking existence', err) 
     return ""; 
    }); 
} 

Verwenden Sie es wie

readExistingFile("…").then(function(contentsOrEmpty) { 
    console.log(contentsOrEmpty); 
}); 

Btw, using fs.exists like you did is an antipattern, und es ist im allgemeinen veraltet. Lassen Sie es und fangen nur den Fehler aus einer nicht vorhandenen Datei:

function readExistingFile(listFile) { 
    return fs.readFile(listFile).then(function(response) { 
     return response.toString(); 
    }, function(error) { 
     if (error.code == "ENOENT") { // did not exist 
      // … 
     } else { 
      console.error('failed to read from the file', error); 
     } 
     return ""; 
    }); 
} 
Verwandte Themen