var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Dzienniki undefined
, dlaczego?
javascript
node.js
karaxuna
źródło
źródło
Odpowiedzi:
Aby rozwinąć to, co powiedział @Raynos, zdefiniowana funkcja to asynchroniczne wywołanie zwrotne. Nie uruchamia się od razu, raczej wykonuje się po zakończeniu ładowania pliku. Po wywołaniu readFile kontrola jest natychmiast zwracana i wykonywany jest następny wiersz kodu. Kiedy więc wywołujesz plik console.log, Twoje wywołanie zwrotne nie zostało jeszcze wywołane, a ta treść nie została jeszcze ustawiona. Witamy w programowaniu asynchronicznym.
Przykładowe podejścia
Albo jeszcze lepiej, jak pokazuje przykład Raynos, zawiń swoje wywołanie w funkcji i przekaż własne wywołania zwrotne. (Najwyraźniej jest to lepsza praktyka). Myślę, że nabycie nawyku owijania wywołań asynchronicznych funkcją, która odbiera połączenia, pozwoli zaoszczędzić wiele problemów i niepotrzebnego kodu.
źródło
'utf8'
po nazwie pliku jako dodatkowy parametr, w przeciwnym razie po prostu zwróci bufor. Zobacz: stackoverflow.com/questions/9168737/…Istnieje w tym celu funkcja synchroniczna:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Asynchroniczny
fs.readFile(filename, [encoding], [callback])
Asynchronicznie odczytuje całą zawartość pliku. Przykład:
Do wywołania zwrotnego przekazywane są dwa argumenty (err, data), gdzie dane są zawartością pliku.
Jeśli nie określono kodowania, zwracany jest bufor surowy.
SYNCHRONICZNY
fs.readFileSync(filename, [encoding])
Synchroniczna wersja fs.readFile. Zwraca zawartość pliku o nazwie nazwa_pliku.
Jeśli określono kodowanie, funkcja ta zwraca ciąg znaków. W przeciwnym razie zwraca bufor.
źródło
data
.if (Buffer.isBuffer( data){ result = data.toString('utf8'); }
Teraz przekonwertowaliśmy bufor na czytelny tekst. Jest to dobre do odczytu pliku zwykłego tekstu lub testowania pliku pod kątem typów formatów. Mógłbym spróbować / złapać, aby zobaczyć, czy jest to na przykład plik JSON; ale dopiero po przekonwertowaniu bufora na tekst. Zajrzyj tutaj, aby uzyskać więcej informacji: nodejs.org/api/buffer.htmlAF 42 F1
. Bardzo praktyczne do komunikacji klient-serwer-klient.źródło
function readContent(callback)
jestcallback
słowo zastrzeżone? Mam na myśli, czy to standardowy sposób na implementację wywołań zwrotnych dla niestandardowych funkcji? Właśnie zacząłem uczyć się węzła.event
alboc
lub dowolną nazwę - to nie jest słowo zarezerwowane w JavaScript, a ja zakładam samo rozciąga się Node.js.readContent(function (err, content)
daje mi błąd składniowy podczas używania funkcji jako parametru.Korzystanie z obietnic w ES7
Wykorzystanie asynchroniczne z mz / fs
mz
Moduł zapewnia promisified wersje biblioteki węzła lokalnego. Korzystanie z nich jest proste. Najpierw zainstaluj bibliotekę ...Następnie...
Możesz też napisać je w funkcjach asynchronicznych:
źródło
użyj tego do synchronicznego wywoływania pliku, bez kodowania jego wyświetlanego wyniku jako bufora.
źródło
Ta linia będzie działać,
źródło
fs.readFileSync
jest metodą synchronizacji, więc nie ma takiej potrzebyawait
. Oczekiwanie jest przydatne w przypadku obietnic ( nodejs.org/api/fs.html#fs_fs_promises_api ), gdy chcesz napisać kod asynchroniczny ze składnią podobną do kodu synchronizacji.źródło
sposób odczytu plików synchronizacji i asynchronizacji:
Węzeł Cheat Dostępny w pliku read_file .
źródło
Jak powiedziano,
fs.readFile
jest to działanie asynchroniczne. Oznacza to, że kiedy każesz węzłowi odczytać plik, musisz wziąć pod uwagę, że zajmie to trochę czasu, a tymczasem węzeł kontynuował działanie następującego kodu. W twoim przypadku to:console.log(content);
.To tak, jakby wysłać część kodu na długą podróż (jak czytanie dużego pliku).
Spójrz na komentarze, które napisałem:
Dlatego
content
jest nadal pusty po zalogowaniu. węzeł nie odzyskał jeszcze zawartości pliku.Można to rozwiązać, przechodząc
console.log(content)
wewnątrz funkcji oddzwaniania, zaraz po niejcontent = data;
. W ten sposób zobaczysz dziennik, gdy węzeł skończy czytać plik i pocontent
otrzymaniu wartości.źródło
Użyj wbudowanej biblioteki promisify (Node 8+), aby te stare funkcje zwrotne były bardziej eleganckie.
źródło
const doStuff = async (filePath) => fs.readFileSync(filePath, 'utf8');
, bez potrzeby użycia zawijania.źródło
Jest tak tylko dlatego, że węzeł jest asynchroniczny i nie będzie czekać na funkcję odczytu, a gdy tylko program się uruchomi, konsoluje wartość jako niezdefiniowaną, co jest prawdą, ponieważ do zmiennej treści nie przypisano żadnej wartości. Aby sobie z tym poradzić, możemy użyć obietnic, generatorów itp. Możemy wykorzystać obietnicę w ten sposób.
źródło
Poniższa funkcja działa w przypadku łańcuchów
async
zawijania lub obietnicythen
źródło
możesz odczytać plik według
Dodając, możesz pisać do pliku,
a nawet połączyć to razem
źródło
Mówiąc w skrócie, masz do czynienia z node.js, który ma charakter asynchroniczny.
Kiedy mówimy o asynchronizacji, mówimy o robieniu lub przetwarzaniu informacji lub danych, mając do czynienia z czymś innym. Przypominamy, że nie jest równoznaczne z równoległością.
Twój kod:
W przypadku próbki w zasadzie najpierw wykonuje część console.log, dlatego zmienna „content” jest niezdefiniowana.
Jeśli naprawdę potrzebujesz danych wyjściowych, zrób coś takiego:
To jest asynchroniczne. Trudno się przyzwyczaić, ale tak właśnie jest. Ponownie jest to szorstkie, ale szybkie wyjaśnienie, czym jest asynchronizacja.
źródło