2012-06-28 3 views
2

node.js가 비동기 호출의 시작/완료 순서를 보증하는지 궁금합니다.node.js가 비동기 실행 순서를 유지합니까?

필자는 생각하지 않습니다. 그러나 비동기 호출이 예상대로 완료되지 않을 수 있기 때문에 인터넷에서 버그 샘플이 될 수있는 코드 샘플을 읽었습니다. 예제는 종종 다음 문맥에서 설명됩니다. 단일 스레드 비동기 모델 때문에 노드가 얼마나 좋은가? 그러나 나는이 일반적인 질문에 대한 직접적인 답을 찾을 수 없다.

다른 노드 모듈이 다른 보장을하는 상황입니까? 예를 들어, https://stackoverflow.com/a/8018371/1072626에서 레디 스는 주문을 보존하는 비동기 호출을 명확하게 표시합니다.

이 문제의 요점은 다음 실행 (또는 유사) 노드에서 엄격하게 안전합니다 삶은 수 있습니다? 사전에 기존 파일이있는 경우 이름 바꾸기가 Windows에서 실패 때문에 unlink에 대한 호출이 필요하다 저자에 따르면

var fs = require("fs"); 
fs.unlink("/tmp/test.png"); 
fs.rename("/tmp/image1.png", "/tmp/test.png"); 

. 그러나 두 호출은 모두 비동기식이므로 rename 호출은 rename 비동기 입출력이 완료되기 전에 unlink 콜백에 있어야하며 그렇지 않으면 rename이 먼저 실행되어 오류가 발생할 수 있습니다.

+1

이름 바꾸기 전에 unlink가 실행되지만 이름 바꾸기가 unlink의 콜백에 없으면 unlink가 완료된 후에 rename이 실행되도록 보장되지 않습니다. –

+1

Redis는 특별한 경우입니다. 한 번에 하나의 명령 만 실행하며 Node.js 드라이버는이 사실을 이용하도록 작성되었습니다. –

+0

@BrandonTilley 감사합니다. 모듈간에 차이가 있으며 일반적으로 내 이해가 정확하다는 것을 분명히합니다. – vossad01

답변

3

비동기 작업에는 결정할 시간이 없습니다.

unlink에 전화하면 OS에서 파일을 제거하도록 요청하지만 OS가 실제로 파일을 제거 할 때 정의되지 않습니다. 밀리 세컨드 또는 1 년 후 일 수도 있습니다.

비동기 작업의 핵심은 명시 적으로 언급하지 않는 한 서로 의존하지 않는다는 것입니다.또는, (이들은 실행 스레드를 차단 않습니다) FS 기능의 동기화 된 버전을 사용하는

fs.unlink("/tmp/test.png", function (err) { 
    if (err) { 
     console.log("An error occured"); 
    } else { 
     fs.rename("/tmp/image1.png", "/tmp/test.png", function (err) { 
      if (err) { 
       console.log("An error occured"); 
      } else { 
       console.log("Done renaming"); 
      } 
     }); 
    } 
}); 

또는 : unlink 이후에 발생하는 rename하기 위해

, 당신은 다음과 같이 코드를 수정해야 : 비동기 코드를 만들기도 async 등이 도서관

fs.unlinkSync("/tmp/test.png"); 
fs.renameSync("/tmp/image1.png", "/tmp/test.png"); 

는 더 잘하기 :

async.waterfall([ 
    fs.unlink.bind(null, "/tmp/test.png"); 
    fs.rename.bind(null, "/tmp/image1.png", "/tmp/test.png"); 
], function (err) { 
    if (err) { 
     console.log("An error occured"); 
    } else { 
     console.log("done renaming"); 
    } 
}); 

모든 예제에서 오류 처리는 아이디어를 나타 내기 위해 극도로 단순화되었습니다.

1

당신은 Node.js를의 documentation 보면 당신은 함수 fs.unlink이 같은 인수로 콜백을 소요 확인할 수있는 것들 : 당신이 때 현재의 기능을하려는

fs.unlink(path, [callback]); 

액션 반환 값은 콜백 인수로 함수에 전달되어야합니다. 그래서 일반적으로 귀하의 경우 코드는 다음과 같은 형태 걸립니다 : 링크 해제의 특정 경우

var fs = require("fs"); 
fs.unlink("/tmp/test.png", function(){ 
    fs.rename("/tmp/image1.png", "/tmp/test.png"); 
}); 

을하고있다 Node.js를 동기식 기능도하고 fs.unlinkSync (경로)와 FS로 사용할 수 있습니다 이름 변경 .renameSync (oldPath, newPath). 이렇게하면 코드가 동 기적으로 실행됩니다.

또한 비동기 구현을 사용하지만 더 나은 가독성을 유지하려는 경우 async과 같은 라이브러리를 고려할 수 있습니다. 또한 병렬, 시리즈, 폭포 등과 같은 다양한 구현 모드에 대한 옵션이 있습니다.

희망이 있습니다.

+1

우리가 동시에 여기에 도착했다는 것은 이상한 우연의 일치입니다. – penartur

+0

@penartur 그렇게 보입니다. :) – almypal

관련 문제