2012-05-05 3 views
0

메모리 내장 모델의 ID를 생성하기 위해 Redis를 사용하고 있습니다. 레디 스 클라이언트는 incr 호출이 동기가 될 그냥 기대 코드가 이미 응용 프로그램의 다른 부분을 작성한 것으로,Node.js에서 동시에 콜백을 처리 할 수 ​​있습니까?

client.incr('foo', function(err, id) { 
    ... continue on here 
}); 

문제가있는 것처럼 보이는 의미 INCR 명령에 대한 콜백을 필요로한다 내가

var id = client.incr('foo'); 

나는이 문제에 도착 이유처럼 사용할 수 있도록 내가

처럼 단순한 폐쇄 카운터 기능과 메모리에 ID를 생성하고, 지금까지, 그 ID를 위로한다 반환
var counter = (function() { 
    var count = 0; 
    return function() { 
    return ++count; 
    } 
})(); 

테스트를 단순화하고 일반적인 설정 만하면됩니다.

내 앱이 설계 상 결함이 있으며 ID 생성시 콜백을 예상하도록 다시 작성해야합니까? 아니면 전화를 동기화하는 간단한 방법이 있습니까?

+0

나는 그것이 당신을 도울 것이라고 생각하지 않지만, 콜백을 필요로하지 않는 set과 incr을 보았다. https://github.com/mranney/node_redis 반환 값을 무시하려는 경우에만 client.set ("foo"및 "client.incr ("할 일 "); ' –

+0

@MiaDiLorenzo' 당신이'set'을 위해 쉽게 할 수있는,하지만 당신이 실제로 원하는 유일한 것은 증가 된 값인'incr'을위한 것이 아닙니다 :) –

+0

오, 이제 알겠습니다. 그렇지 않으면 별도로 콜백이 필요한 get을 작성해야합니다. –

답변

3

Node.js는 본질적으로 비동기 I/O 라이브러리 (플러그인 포함)입니다. 따라서 정의 상 거기에는 동기 I/O가 없으므로 앱을 다시 작성해야합니다.

2

약간의 고통이지만, 카운터 생성 후 발생한 논리를 함수로 래핑하고 Redis 콜백에서 호출합니다. 다음과 같은 경우 :

var id = get_synchronous_id(); 
processIdSomehow(id); 

이 작업을 수행해야합니다.

var runIdLogic = function(id){ 
    processIdSomehow(id); 
} 

client.incr('foo', function(err, id) { 
    runIdLogic(id); 
}); 

적절한 오류 검사가 필요하지만 그와 비슷한 것이 좋습니다.

노드 (예 : TameJS)에 대한 몇 가지 순차 프로그래밍 계층이 있는데 원하는대로 도움이 될 수 있지만 일반적으로 재 컴파일 또는 이와 같은 작업을 수행합니다. 다음과 같은 경우에 편안하게 결정해야합니다. 당신은 그들을 사용하고 싶습니다.

0

@Sergio가 대답을 간단히 말했지만 확장 된 대답을 조금 더 작성하려고합니다. node.js는 비동기식 디자인입니다. 이것은 단일 스레드에서 실행됩니다. 즉, 빠르게 유지되고 많은 동시 작업을 처리하기 위해 모든 차단 호출은 비동기 적으로 실행하기 위해 반환 값에 대한 콜백을 가져야합니다.

그렇다고해서 동기 호출을 사용할 수 없다는 의미는 아닙니다. 그것들은 제 3 자 플러그인을 어떻게 신뢰하는지에 대한 관심사입니다. 누군가가 자신의 플러그인에서 차단하는 전화를 쓰기로 결정했다면, 당신은 그 호출의 자비에 머물러 있습니다. 그 호출은 내부적으로 API에 노출되지 않은 것일 수도 있습니다. 따라서 전체 앱을 차단할 수 있습니다. Redis가 반환하는 데 상당한 시간이 걸렸을 때 일어날 수있는 일을 고려한 다음 잠재적으로 동일한 루틴에 액세스 할 수있는 클라이언트의 양으로 여러 번 수행 할 수 있습니다. 전체 로직이 직렬화되어 모두 대기합니다.

마지막 질문에 대한 답으로 사용자는 차단 접근 방식을 수용하지 않아야합니다. 처음에는 node.js의 이점에 직관적 이었지만 현재는 간단한 솔루션처럼 보일 수 있습니다. 동기식 디자인 워크 플로우에서보다 편한 편이라면, (스레드로) 그런 식으로 설계된 다른 프레임 워크를 고려하는 것이 좋습니다. node.js를 계속 사용하려면 기존 논리를 다시 작성하여 콜백 스타일을 따르십시오.필자가 보았던 코드 예제에서, 콜백 함수는 중첩 된 함수처럼 보입니다. 콜백은 재귀 적 스택에서 반환 될 때까지 콜백을 사용합니다.

0

node.js의 응용 프로그램 상태는 일반적으로 객체로 전달됩니다. 내가 할일은 다음과 같습니다.

var state = {} 

client.incr('foo', function(err, id) { 
    state.id = id; 
    doSomethingWithId(state.id); 
}); 

function doSomethingWithId(id) { 
    // reuse state if necessary 
} 

일을하는 방식이 다릅니다.

관련 문제