2017-12-03 10 views
0

일련의 비동기 작업을 차례로 수행하는 REST API가 있습니다. 코드는 다음과 같습니다.Node.js의 약속 체인에 대한 잠금

asyncFunc1() 
.then(asyncFunc2()) 
.then(asyncFunc3()) 
.then(asyncFunc4()) 

첫 번째 단계는 일부 데이터베이스 쿼리를 수행하고 마지막 단계는 데이터베이스를 업데이트합니다. 당연히 (내가 java/C++ 배경에서 왔기 때문에), 데이터베이스와의 상호 작용이 보호되는지 확인하기 위해 약속을 시작할 때 잠금 장치를 추가 할 것입니다.

하지만 Node.js를 처음 접했고 단일 스레드 모드에서의 비동기 처리가 여기에 혼란을 일으켰습니다. 그렇다면 약속을 연결하는 데 하나의 자물쇠를 추가하거나 데이터베이스 작업과 관련된 각 단계마다 자물쇠를 추가해야합니까? 그렇지 않으면 자물쇠가 전혀 필요하지 않습니까?

-------- 갱신 ---------

하나의 주석으로

과 대답은 내가 (내 실제 코드이었다 잘못 내 체인을 썼다을 지적 정확하지만, 단지 실제로 내 체인의 시작 부분에 Redlock 사용)

asyncFunc1() 
    .then(asyncFunc2) 
    .then(asyncFunc3) 
    .then(asyncFunc4) 

$이 좋은 생각입니다 있는지 확실하지 않다 : 나는 Node.js를 새로운 오전 나타내는 서명합니다. Rahul Singh이 제공 한 대답은 내가 자물쇠가 필요 없다고 말했습니다! 새로운 약속을 사용하여 약속을 만들 때

+0

에 대한 잠금 보호를 무엇? – stone

+0

우선, 체인이 잘못되었습니다. 그것은 'asyncFunc1(). then (asyncFunc2) .then (asyncFunc3)'등이어야합니다. 함수 참조 전달 - 먼저 호출하지 않고 반환 결과를 전달합니다. – jfriend00

+0

의도적으로 시퀀스 된 명령이있는 단일 스레드 모드는 해당 코드 시퀀스에 대해 DB 잠금을 사용해서는 안됩니다. 그러나 다른 요청이 동시에 실행되는 경우 동시성 문제를 피하기 위해 DB 업데이트를 처리하는 방법은 코드가 수행하는 작업과 데이터베이스의 작동 방식에 전적으로 달려 있습니다. 잠금에 대한 일반 요구 사항은 없지만 DB를 사용하여 수행 한 작업은 데이터베이스를 사용하여 다른 요청과 경쟁 조건으로부터 어떻게 든 보호해야 할 수도 있습니다. – jfriend00

답변

0

()가 호출, 그래서 당신이 그들을 체인 때 당신이 그들을 만들 수 없습니다로 기능이 실제로 실행되는 모든 .

asyncFunc1().then(asyncFunc2).then()... 

가 asyncFunc1는 약속 아닌 약속 자체를 반환하는 함수이어야한다처럼

귀하의 체인 기능이 있어야한다.

는 놀란 로손에 의해 약속에 좀 더를위한이 article을 가지고

+0

네, 여기 잘못 썼습니다. (node.js를 처음 접했기 때문에 $$ 실제 코드는 맞습니다.) – Qiulang

+0

@Qiulang 간단히 말해서 잠금 장치가 필요 없으므로 약속을 처리 할 것입니다. –

+0

@ jfriend00에서 얻은 또 다른 주석으로, 내 코드는 "뭔가를 읽고 수정하고 다시 작성"합니다. 내 REST API가 동시에 호출되어 잠금을 추가한다고 가정합니다. – Qiulang