저는 js (특히 node & express)를 배우고 있으며 현재 정확히 무엇이 동기화이고 무엇이 아닌지 파악하기 위해 고군분투하고 있습니다.
현재 B 형 서비스에 요청을 보내야하는 A 형 서비스를 예로 들어 보겠습니다. 모든 A 유형 서비스에서 사용할 수 있도록 이러한 요청을 공통 함수로 집계하고 싶었습니다.
A 형 서비스 코드 (router.post에서 직접)
var post_data = <some data>
sendBServicePost(post_data,function (out_data) {
var resp_data = JSON.parse(out_data);
if (resp_data.status == "OK") {
var msg = 'Request OK : '+out_data;
console.log(msg);
res.json({ status:"OK", message:msg});
}
else
{
var msg = 'Login KO: '+out_data;
console.log(msg);
res.json({ status:"KO_FUNC", message:msg});
}
}).on('error',function (e) {
var msg = 'Error with call: ' + e.message;
console.log(msg);
res.json({ status:"KO_TECH", message:msg});
});
그리고 다음은 범인 함수의 코드입니다.
function sendBServicePost(post_data,callback) {
var post_options = {
// Some options
};
// Sending request
var post_req = http.request(post_options, function(post_res) {
post_res.on('data', function(out_data) {
callback(out_data);
});
});
post_req.write(post_data);
post_req.end();
}
그래서 무슨 일이 일어나고 있는지는 응답이 이미 전송 된 상태에서 응답 헤더를 추가하려고한다는 오류가 발생하는 것인데, 이는 콜백 함수 코드에 도달하기 전에 A 유형 서비스의 실행이 완료 되었기 때문에 발생한다고 가정합니다. 콜백이 스택되고 실행이 전체 스택을 통과 할 것이라고 생각했기 때문에이 체인에서 정확히 비동기가 무엇인지 말하기가 어렵습니다.
누군가이 문제에 대해 밝힐 수 있습니까? 이 체인을 어떻게 동기화 할 수 있습니까? 여기에 몇 가지 모범 사례가 있습니까?
지금보고있는 핵심 문제는 'data'
이벤트가 데이터 조각으로 여러 번 발생할 수 callback
있으므로 res.json
여러 번 호출하므로 여러 번 호출 하여 오류가 발생한다는 것입니다.
또한 node
일반적으로 콜백을 전달하여 첫 번째 매개 변수를 오류로 사용하는 코드를 표준화 했으므로 다음을 권장합니다.
function sendBServicePost(post_data, callback) {
var post_options = {
// Some options
};
// Sending request
var post_req = http.request(post_options, function(post_res) {
var pieces = [];
post_res.on('data', function(out_data) {
pieces.push(out_data);
});
post_res.on('end' function(){
callback(null, Buffer.concat(pieces));
});
post_res.on('error', function(err){
callback(err, null);
});
});
post_req.on('error', function(err){
callback(err, null);
});
post_req.write(post_data);
post_req.end();
}
다음과 같이 부름 :
var post_data = <some data>
sendBServicePost(post_data, function (err, out_data) {
if (err){
var msg = 'Error with call: ' + e.message;
res.json({ status: "KO_TECH", message: msg});
return;
}
var resp_data = JSON.parse(out_data);
if (resp_data.status == "OK") {
var msg = 'Request OK : ' + out_data;
res.json({status: "OK", message: msg});
} else {
var msg = 'Login KO: ' + out_data;
res.json({status: "KO_FUNC", message: msg});
}
});
실제로 더 많은 코드를 원하면 .on('error',
항상에서 이벤트 이미 터 객체를 반환 할 수 sendBServicePost
있지만 패러다임을 혼합하지 않도록 콜백을 이벤트 기반으로 재 작업하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다