함수를 노출하는 라이브러리를 유지한다고 가정합니다 getData
. 사용자는이를 호출하여 실제 데이터를 얻습니다. 내부
var output = getData();
데이터는 파일에 저장되므로 getData
Node.js 내장 fs.readFileSync
. 둘 다 명백 getData
하고 fs.readFileSync
동기화 기능입니다. 어느 날 기본 데이터 소스를 비동기식으로 만 액세스 할 수있는 MongoDB와 같은 저장소로 전환하라는 지시를 받았습니다. 또한 사용자를 화나게하는 것을 피하라는 지시를 받았습니다. getData
API는 단순히 약속을 반환하거나 콜백 매개 변수를 요구하도록 변경할 수 없습니다. 두 가지 요구 사항을 어떻게 충족합니까?
콜백 / 약속을 사용하는 비동기 함수는 JavasSript와 Node.js의 DNA입니다. 사소하지 않은 JS 앱에는이 코딩 스타일이 스며들 수 있습니다. 그러나 이러한 관행은 소위 둠의 콜백 피라미드로 쉽게 이어질 수 있습니다. 더 나쁜 것은 호출 체인의 호출자의 코드가 비동기 함수의 결과에 의존하는 경우 해당 코드도 콜백 함수로 래핑되어 호출자에게 코딩 스타일 제약을 부과해야합니다. 때때로 대규모 글로벌 리팩토링을 피하기 위해 비동기 함수 (종종 타사 라이브러리에서 제공됨)를 동기화 함수로 캡슐화해야합니다. 이 주제에 대한 솔루션을 찾는 것은 일반적으로 Node Fibers로 끝났습니다.또는 그것에서 파생 된 npm 패키지. 그러나 Fibers는 내가 직면 한 문제를 해결할 수 없습니다. Fibers의 저자가 제공 한 예조차도 결함을 설명했습니다.
...
Fiber(function() {
console.log('wait... ' + new Date);
sleep(1000);
console.log('ok... ' + new Date);
}).run();
console.log('back in main');
실제 출력 :
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Function Fiber가 실제로 비동기 함수 절전을 동기화로 전환하는 경우 출력은 다음과 같아야합니다.
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
back in main
JSFiddle 에서 또 다른 간단한 예제를 만들고 예상 출력을 생성하는 코드를 찾았습니다. Node.js에서만 작동하는 솔루션을 수락하므로 JSFiddle에서 작동하지 않아도 npm 패키지를 자유롭게 요구할 수 있습니다.