2017-05-23 9 views
1

저는 비동기 프로그래밍에 익숙하지 않으며 요청시 두 개의 별도 DB 호출을 수행하는 코드 집합이있는 기본적인 문제가 있습니다. 신체 매개 변수. 이는 DB 호출을 수행하고 약속을DB 호출을 사용하여 노드 jsync에서 로컬 변수에 데이터를 보내려면 어떻게해야합니까?

  1. validateExam
  2. validateUserExists
  3. 내가 변수 다음에 반환이 myExam에 비동기 호출에서 resullts을 저장할

을 반환하는 두 가지 방법이 있습니다 응답.

getExam: function(req, res) { 
    var myExam = {}; 
    var coupon = req.body.coupon; 
    var email = req.body.email; 


    async.series([ 
     function(callback) { 
      validateExam(coupon) 
       .then(function(success) { 

        callback(null, success); 
       }); 
     }, 
     function(callback) { 
      validateUserExists(email) 
       .then(function(result) { 
        callback(null, result); 
       }) 
     } 
    ], function(error, results) { 
     myExam.res = results; 

    }); 


    res.json({ 
     "status": 400, 
     "message": myExam 
    }); 
}, 
+0

res.json는 async.series의 콜백 함수 내에서해야한다. 바로 아래에 myExam.res = 결과 – yBrodsky

답변

1

함수에서 비동기 적으로 검색 한 값을 반환 할 수 없습니다. 비동기 작업이 완료되기 전에 함수가 반환됩니다. 대신 반환 된 약속을 통해 또는 비동기 작업이 완료 될 때 호출 할 수있는 콜백을 전달하여 반환 값을 호출자에게 다시 전달해야합니다. 자세한 내용은 How do I return the response from an asynchronous call?을 참조하십시오.

또한 비동기 라이브러리를 사용하여 두 가지 약속 작업을 관리하는 것은 매우 이상합니다. 약속에는 비동기 작업을 관리하기 위해 모든 도구가 내장되어 있으므로 핵심 작업이 이미 약속을 되 돌리는 경우 비동기 라이브러리를 직접 사용하지 않고 이러한 약속을 직접 사용해야합니다.

코드를 살펴보면 시험의 유효성을 검사하고 사용자의 유효성을 검사하는 것이 독립적 인 작업이며 병렬로 실행하고 Promise.all()을 사용하면 두 가지 약속이 모두 완료되었음을 알 수 있습니다.

당신은 같은 것을 할 수 있습니다

getExam: function(req, res) { 
    var coupon = req.body.coupon; 
    var email = req.body.email; 

    Promise.all([validateExam(coupon), validateUserExists(email)]).then(function(results) { 
     // results is a two element array that contains the two validation results 
     // send your response here based on the results array (not clear to me exactly what you want here) 
     res.json(...); 
    }).catch(function(err) { 
     // return some sort of error response here 
     res.status(500).json(...); 
    }); 
}, 
+0

사실 내 문제는 우리가 비즈니스 로직을 작성하는 방법입니다, 내가 여러 DB 호출이 필요하고 그 db 호출이 속속들이 연속적으로 필요가있는 사용 사례가 있다고 말할 수 있습니다. 위에 언급 한 것과 같은 방법으로 적어 두라고 제안합니까? –

+0

@ Sanjay-Dev - 아마 여기 새로 왔을 지 모르지만이 사이트는 질문을하고 일반적인 주제를 배우기위한 튜토리얼 사이트로 잘 작동하지 않습니다. 대신 특정 문제가 발생하면 작업하려는 코드를 게시하고 특정 솔루션을 도울 수 있습니다. 그것이 당신이 답안에 올린 코드에 대한 것입니다. 약속은 필요한 방식으로 (비 순차적으로 또는 순서대로 또는 조합하여) 비동기 작업을 조정하는 데 사용할 수 있습니다. 내가 제시 한 코드가 그러한 연산의 순서를 필요로하지 않기 때문에 병렬로 실행중인 연산에 대한 대답을 제공했습니다. – jfriend00

+0

@ Sanjay-Dev - 비동기 작업을 병렬로 실행하는 것이 병렬 작업이 가능할 때 순차적으로 실행하는 것보다 거의 항상 빠릅니다. 약속을 사용하여 작업을 순서 지정하는 방법에 대한 이미 스택 오버플로에 대한 답변이 많이 있습니다. 비동기 작업 순서 지정에 대한 답변은 https://stackoverflow.com/questions/29880715/how-to-synchronize-a-sequence-of-promises/29906506#29906506입니다. 다른 많은 것들이 있습니다. 비동기 작업 순서 지정에 도움이 필요하면 동기화해야하는 실제 코드와 함께 새로운 질문을 게시하십시오. – jfriend00