2017-02-07 1 views
0

Node가 병렬 처리이고 함수 호출에서 값을 반환하는 것과 관련하여 Node가 작동하는 방식을 이해하는 데 문제가 있습니다.노드가 함수 자체에서 모든 작업을 완료하기 전에 함수 호출에서 값을 반환 할 수 있습니까?

FYI : 아래 꿀꺽 꿀꺽한 함수는이 질문의 예제로 만들어졌습니다.

Read a large file 문이 처리를 완료하기 전에 함수가 스트림을 반환 할 수 있는지 (파일 시스템에서 대용량 파일을 완전히 읽고 스트림을 추가 한 경우) 또는 모든 명령문을 완료 할만큼 충분히 똑똑 할 수 있습니까 돌아 오기 전에?

function moveFiles(){ 

    var gulp = require('gulp'), 
     stream = require('merge-stream')(); 

    // Read a large file 
    stream.add(gulp.src('src/large-file.txt') 
     .pipe(gulp.dest('dest/')) 
    ); 

    // Read a small file 
    stream.add(gulp.src('src/small-file.txt') 
     .pipe(gulp.dest('dest/')) 
    ); 

    return (stream.isEmpty() ? null : stream); 

} 
+0

스트림을 정확히입니다 : 자세한 내용은

그 해답의 일부를 참조하십시오에 대한 포인터 아직 (또는 부분적으로 만) 읽기 파일. 함수가 이미 전체 내용을 읽었다면 어떤 스트림이 좋을까요? – Bergi

+0

[비동기 프로그래밍] (https://en.wikipedia.org/wiki/Asynchrony_ (computer_programming))의 멋진 세계에 오신 것을 환영합니다! – Bergi

+0

@Bergi 예, 비동기식 측면은 혼란 스럽습니다. 이 질문은 꿀꺽 꿀꺽 꿀꺽히는 것과 관련이 없습니다. 또 다른 예는 노드를 사용하는 것입니다 : 같은 함수가 파일 시스템에서 두 개의 파일을 읽는다는 것입니다 (꿀꺽 꿀꺽 마는이나 스트림을 사용하지 않고 단순한 노드'fs' 호출을 사용하지 않음). 그러면이 함수는 함께 concatenated 된 두 파일의 내용을 반환해야합니다. 두 파일을 모두 읽기 전에 return 문이 실행될 수 있습니까? –

답변

0

는 실행 가능하게 노드 함수 자체 내에서 모든 작업을 완료하기 전에 함수 호출에서 값을 반환 할 수 있을까요?

이것은 까다로운 질문입니다. 대답은 '아니요'입니다. 값을 반환하는 것은 함수가 실행을 마쳤다는 것을 의미합니다. 스택에서 다시 가져와 다시는 아무 것도하지 않습니다. 물론 다른 시간이 호출되지 않는 한,이 특정 호출 끝났어.

하지만 까다로운 부분은 이라는 기능이 실행 완료되었으므로 나중에 다른 일정을 예약 할 수 없다는 의미는 아닙니다. 1 분 안에 더 복잡해 지겠지만, 처음에는 아주 간단한 예가 될 것입니다. 여기

function x() { 
    setTimeout(function() { 
     console.log('x1')); 
    }, 2000); 
    console.log('x2'); 
    return; 
    console.log('x3'); 
} 

당신이 그때는 2 초 후 다시 실행하는 또 다른 기능을 예약 할 x() 전화, 그것은 x2를 인쇄합니다 후 반환합니다 - 어떤 점에서이 기능은 그것에 대해 다시 다른 작업을 수행 할 수 기도.

즉, 은 인쇄되지 않지만 결국은 x1이 인쇄됩니다. 이는 시간 초과가 발생할 때 호출 될 또 다른 기능이기 때문입니다. 익명 함수는 함수가 반환 된 후에 아무 것도 할 수 없기 때문에 호출되지 않고 반환되기 전에 시간 제한을 예약 할 수 있기 때문에 호출됩니다.

이제 미래에 일어날 일들을 스케줄링하는 대신, 함수는 얼마 후 해결 될 약속을 반환 할 수 있습니다. 당신이 지금 실행

function y() { 
    console.log('y1'); 
    return new Promise(function (resolve, reject) { 
     setTimeout(function() { 
      resolve('message from y()'); 
     }, 2000); 
    }); 
    console.log('y2'); 
} 

: : 예를 들어

var promise = y(); 

무엇이 일어날 것은 y1가 인쇄 얻을 것이다 새로운 약속을 반환받을 것이며, y2 그 시점 y()에 있기 때문에 인쇄 만나지 것입니다 돌아 왔고 다른 것을 할 수 없습니다. 그러나 2 초 후에 약속을 해결할 수있는 시간 제한을 계획 할 수있었습니다. 그래서 예를 들어 당신이 y() 기능 자체가 돌아와 다른 작업을 수행 할 수는 없지만, (이 경우 익명의) 다른이 함수를 호출 할 수 있음을 알 수

promise.then(function (value) { 
    console.log(value); 
}); 

:

당신은 그것을 관찰 할 수있다 미래는 y() 기능이 시작한 일을 끝내십시오.

이제 까다로운 질문 인 이유는 분명합니다. 어떤 식 으로든 함수는 반환 후에 아무 것도 할 수 없습니다. 그러나 함수가 반환 된 후 무언가를 할 수있는 시간 초과, 이벤트 처리기 등으로 다른 함수를 예약 할 수있었습니다. 함수가 반환하는 것이 약속이라면 호출자는 준비가되었을 때 미래의 값을 쉽게 관찰 할 수 있습니다.

모든 예제는 화살표 함수를 사용하여 단순화 할 수 있지만 모든 함수는 별도의 함수이며 일부는 익명입니다.

+0

종합적인 설명 주셔서 감사합니다. 정말 도움이됩니다. 그래서 위의 꿀꺽 꿀꺽한 예제를 사용하여 제 경우에는 Node/Gulp 환경 API/메소드 중 실제로 비동기식/동기식을 이해해야합니다. 그래서 다음과 같은 것이 동기인지 아닌지 물어볼 필요가 있습니다 :'stream.add()','gulp.src()' –

관련 문제