2012-07-24 1 views
2

내 index.js에 제출 단추를 누를 때 ajax를 통해 클라이언트에 데이터를 다시 보내야하는 내보내기 기능이 있습니다. 그러나 사용자가 제출을 누르면 데이터가 수정되기 전에 데이터가 전송 된 것으로 보입니다. 제출 버튼을 한 번 더 누르면 이전에 수정 된 데이터가 전송 버튼을 클릭하면 '이전'설정 데이터 만 전송됩니다. Node.js res.send가 작동하지 않습니다.

 var tabledata = getRecordFromDatabase(key); 
     if(tabledata.length === 0) 
      tabledata = 'There is no matched record in the database'; 
     res.contentType('text/html'); 
     res.send({'matched':tabledata}); 

그래서 오류를 설명하기 : 이것은 내 코드 나는 양식을 작성 후 제출하고 메시지를 다시 받기를 클릭 "데이터베이스에 더 일치하는 기록이 없습니다." 나는 방금 채운 형태로 아무것도 바꾸지 않고 두 번째 시간을 제출했다. 이 시간 기록 데이터는 실제로 나에게 보내집니다. 왜 이럴 수 있니?

답변

4

getRecordFromDatabase에서 수행중인 작업이 비동기식이고 비 차단 인 경우 node.js는 정상적으로 동작합니다. Node.js는 비 블로킹입니다. 중지되지 않고 프로세스가 완료 될 때까지 대기합니다 (프로세스가 의도적으로 차단하도록 작성되지 않은 경우 (일반적으로 node.js에서는 피함). 이것은 서버가 새로운 요청을 받아들이고 많은 요청을 즉시 처리 할 수있게하기 때문에 유용합니다.

데이터베이스 호출이 비동기 인 경우 res.send() 전에 데이터 호출이 반환되기를 기다리지 않아도됩니다. 그래서 첫 번째 제출이 다시 비어있는 것입니다. 대부분의 경우 두 번째 시간에 제출할 때까지 DB 호출이 마침내 반환되었으므로 결과를 얻을 수 있습니다.

DB 호출 방법에서 발생하는 일을 추상화했기 때문에 문제에 대한 코드 기반 답변을 제공하기가 어렵습니다. 그러나 일반적으로, 비동기 호출이 같은 갈 것이다 : - 비동기 호출이 완료 될 때, 그것은 콜백, 다음이 실행을 실행

getRecordFromDatabase(key, function(err, data){ 
    if(data.length === 0) 
     data = 'There is no matched record in the database'; 
    res.contentType('text/html'); 
    res.send({'matched':data}); 
}); 

이 방법을, 당신은 당신의 비동기 메서드에 콜백으로 실행하는 기능을 전달하는 해당 데이터가있는 res.send().

+1

트릭을 수행했기 때문에 콜백 함수를 사용하는 방법도 배웠습니다. 감사! –