86 votes

Différence entre readFile() et readFileSync()

Le code suivant envoie au navigateur le contenu du fichier index.html (qui contient simplement le texte hello world). Cependant, lorsque je remplace readFile() con readFileSync() la demande n'aboutit pas.

Qu'est-ce qui m'échappe ? Un autre type de tampon est-il nécessaire ? J'utilise node 0.61 et express 2.4.

var express = require('express');
var fs = require('fs');

var app = express.createServer(express.logger());

app.get('/', function(request, response) {
    fs.readFile('index.html', function(err, data){
        response.send(data.toString());
    });
});

var port = process.env.PORT || 5000;
app.listen(port, function() {
  console.log("Listening on " + port);
});

101voto

bryanmac Points 22834

fs.readFile prend un rappel qui appelle response.send comme vous l'avez montré - bien. Si vous remplacez simplement cela par fs.readFileSync Il faut savoir qu'il ne prend pas de callback, donc votre callback qui appelle response.send ne sera jamais appelé et donc la réponse ne se terminera jamais et elle sera temporisée.

Vous devez montrer votre code readFileSync si vous ne remplacez pas simplement readFile par readFileSync.

De plus, pour votre information, vous devez jamais appeler readFileSync dans un node express/webserver car cela bloquerait la boucle à un seul thread pendant que les E/S sont effectuées. Vous voulez que la boucle du nœud traite d'autres demandes jusqu'à ce que les E/S soient terminées et que votre code de gestion des rappels puisse être exécuté.

40voto

Saurabh Chauhan Points 356
'use strict'
var fs = require("fs");

/***
 * implementation of readFileSync
 */
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");

/***
 * implementation of readFile 
 */
fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

Pour une meilleure compréhension, exécutez le code ci-dessus et comparez les résultats.

21voto

Paresh Barad Points 742

readFileSync() est synchrone et bloque l'exécution jusqu'à ce qu'elle soit terminée. Ils renvoient leurs résultats sous forme de valeurs de retour. readFile() sont asynchrones et reviennent immédiatement alors qu'elles fonctionnent en arrière-plan. Vous passez une fonction de rappel qui est appelée lorsqu'elles se terminent. Prenons un exemple non bloquant.

La méthode suivante lit un fichier de manière non bloquante

var fs = require('fs');
fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        console.log(data);
});

La lecture d'un fichier se fait de manière bloquante ou synchrone.

var data = fs.readFileSync(filename);

LOL... Si vous ne voulez pas readFileSync() comme voie de blocage, puis prendre référence dans le code suivant. (Natif)

var fs = require('fs');
function readFileAsSync(){
    new Promise((resolve, reject)=>{
        fs.readFile(filename, "utf8", function(err, data) {
                if (err) throw err;
                resolve(data);
        });
    });
}

async function callRead(){
    let data = await readFileAsSync();
    console.log(data);
}

callRead();

c'est méchant dans les coulisses readFileSync() fonctionne de la même manière que ci-dessus (promesse) base.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X