"use strict"
const
fs = require('fs'),
stream = fs.createReadStream("file.txt"),
timeout = 0;
stream.on('data', function() {
console.log("File Read");
});
setTimeout(function(){
console.log("setTimeout : " + timeout);
}, timeout);
node.js / javascript를 배우고 있는데 왜이 프로그램이 반환되는지 궁금합니다.
setTimeout : 0
File Read
그 반대는 아닙니다.
내가 틀렸지 만 javascript
콜백 대기열에 fifo가 있고 stream
첫 번째와 먼저 쌓인 경우 수정 하시겠습니까?
의 비 차단 특성으로 인해 nodejs
두 콜백이 "병렬"로 실행되고 setTimeout
먼저 완료되고 반환된다고 생각합니다 (예 : 1000ms의 타임 아웃은 결과를 전환 함).
내가 틀렸지 만 자바 스크립트에서 콜백 대기열이 fifo이고 스트림을 먼저 쌓은 경우 수정합니까?
좀 빠지는. 비동기 콜백은 작업이 시작된 순서가 아니라 작업 을 완료 한 순서대로 FIFO로 처리됩니다 . 따라서 작업을 완료하는 데 걸리는 시간은 콜백이 예약되는시기를 결정하는 데 매우 중요합니다. 짧은 작업은 나중에 시작된 경우에도 긴 작업 전에 완료 될 수 있습니다.
파일을 열고 읽기 시작하는 데 시간이 걸리고 시간이 setTimeout()
걸리지 않으므로 먼저 발생합니다. 독립적 인 비동기 작업이있는 경우 다양한 기능의 내부 타이밍에 따라 달라지기 때문에 어떤 순서로 발생하는지 거의 "알 수 없습니다".
readStream 작업은 타이머가 시작되기 전에 시작되지만 두 비동기 작업에 내부적으로 필요한 작업량으로 인해 readStream 작업이 첫 번째 데이터를 가져 오기 전에 타이머가 완료됩니다.
나는 nodejs의 비 차단 특성으로 인해 두 콜백이 "병렬"로 실행되고 setTimeout이 먼저 완료되고 반환된다고 생각합니다 (예를 들어 1000ms의 타임 아웃은 결과를 전환 함).
네, 맞습니다.
이렇게 생각하세요. 두 개의 강력한 메가폰과 정말 좋은 마이크가 있습니다. 메가폰을 가리키고 반환 된 에코를 듣기 위해 두 개의 타겟을 설정했습니다. 하나의 목표, 즉 매우 가깝고 하나의 목표는 매우 멀리 있습니다. 먼저 아주 멀리있는 목표물에서 확성기를 폭파 한 다음 즉시 가까운 목표물에서 확성기를 폭파합니다. 당연히 첫 번째 후 폭발을 보냈음에도 불구하고 가까운 대상에서 에코를 먼저 얻습니다. 왜냐하면 멀리있는 대상의 에코가 모든 추가 거리를 가로 질러 다시 돌아 오는 데 훨씬 더 오래 걸리기 때문입니다. readStream도 마찬가지입니다. 당신이 먼저 시작하더라도, 그것은 많은 이상보다 오래 걸리는 setTimeout(fn, 0)
너무 setTimeout()
첫째 완료 따라서 먼저 콜백을 호출합니다.
타이밍이 중요하다면 약속과 같은 도구를 사용하여 비동기 작업을 구체적으로 시퀀싱하거나 필요한 모든 결과가 준비 될 때까지 기다려야합니다. 좋은 설계는 코드에서 작업 순서를 지정하여 특별히 보장하지 않는 한 한 비동기 작업이 다른 작업보다 먼저 완료 될 것이라고 "가정"해서는 안됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다