Node.js의 콜백 함수에서 값 반환
이 질문에 이미 답변이 있습니다.
- 비동기 호출에서 응답을 어떻게 반환합니까? 36 답변
Node.js의 콜백 함수에서 값을 반환하는 데 작은 문제가 있습니다. 가능한 한 쉽게 내 상황을 설명하려고 노력할 것입니다. URL을 가져와 해당 URL을 입력하고 출력을 제공하는 스 니펫이 있다고 생각해보십시오.
urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
});
함수 안에 감싸고 다음과 같은 값을 반환하려고했습니다.
function doCall(urlToCall) {
urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
return finalData;
});
}
내 Node.js 코드에는 다음과 같이 if-else
값 urlToCall
이 결정 되는 많은 진술 이 있기 때문입니다.
if(//somecondition) {
urlToCall = //Url1;
} else if(//someother condition) {
urlToCall = //Url2;
} else {
urlToCall = //Url3;
}
문제는의 urllib.request
값을 제외하고 는 will 내부의 모든 문 이 동일하게 유지된다는 것입니다 urlToCall
. 그래서 확실히 공통 코드를 함수 안에 넣어야합니다. 나는 똑같이 시도했지만 doCall
항상 나를 반환합니다 undefined
. 나는 이렇게 시도했다 :
response = doCall(urlToCall);
console.log(response) //Prints undefined
그러나 내부에 값 doCall()
을 인쇄하면 완벽하게 인쇄되지만 항상 undefined
. 내 연구에 따르면 콜백 함수에서 값을 반환 할 수 없다는 것을 알게되었습니다! (사실입니까)? 그렇다면 모든 if-else
블록 에서 중복 코드를 방지하고 싶기 때문에 누구든지이 상황을 처리하는 방법을 조언 해 줄 수 있습니다 .
그 전에 실행 이 완료 되기 undefined
때문 입니다. 요청 이 완료 되면 실행되는 콜백 함수도 전달해야 합니다.console.log(response)
doCall(urlToCall);
첫째, 당신의 기능. 콜백을 전달합니다.
function doCall(urlToCall, callback) {
urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
return callback(finalData);
});
}
지금:
var urlToCall = "http://myUrlToCall";
doCall(urlToCall, function(response){
// Here you have access to your variable
console.log(response);
})
@Rodrigo 는 댓글에 좋은 리소스 를 게시했습니다 . 노드의 콜백 과 작동 방식 에 대해 읽어보십시오 . 비동기 코드임을 기억하십시오.
Node.js의 콜백 함수에서 값을 반환하는 데 작은 문제가 있습니다.
이것은 "작은 문제"가 아니며, 비동기 함수에서 전통적인 의미로 값을 "반환"하는 것은 실제로 불가능합니다.
"값을 반환"할 수 없기 때문에 일단 값이 필요한 함수를 호출해야합니다. @display_name은 이미 귀하의 질문에 대답했지만 doCall의 반환 이 전통적인 방식으로 값 을 반환하지 않는다는 점을 지적하고 싶었습니다 . 다음과 같이 doCall을 작성할 수 있습니다.
function doCall(urlToCall, callback) {
urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
// call the function that needs the value
callback(finalData);
// we are done
return;
});
}
Line callback(finalData);
is what calls the function that needs the value that you got from the async function. But be aware that the return statement is used to indicate that the function ends here, but it does not mean that the value is returned to the caller (the caller already moved on.)
If what you want is to get your code working without modifying too much. You can try this solution which gets rid of callbacks and keeps the same code workflow:
Given that you are using Node.js, you can use co and co-request to achieve the same goal without callback concerns.
Basically, you can do something like this:
function doCall(urlToCall) {
return co(function *(){
var response = yield urllib.request(urlToCall, { wd: 'nodejs' }); // This is co-request.
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
return finalData;
});
}
Then,
var response = yield doCall(urlToCall); // "yield" garuantees the callback finished.
console.log(response) // The response will not be undefined anymore.
By doing this, we wait until the callback function finishes, then get the value from it. Somehow, it solves your problem.
Example code for node.js - async function to sync function:
var deasync = require('deasync');
function syncFunc()
{
var ret = null;
asyncFunc(function(err, result){
ret = {err : err, result : result}
});
while((ret == null))
{
deasync.runLoopOnce();
}
return (ret.err || ret.result);
}
참고URL : https://stackoverflow.com/questions/23339907/returning-a-value-from-callback-function-in-node-js
'Development Tip' 카테고리의 다른 글
jQuery는 AJAX 스트림을 점진적으로 읽습니까? (0) | 2020.11.04 |
---|---|
벡터를 무작위 화하는 방법 (0) | 2020.11.04 |
x? .y? .z는 무엇을 의미합니까? (0) | 2020.11.04 |
Firebase 콘솔에서 APN 용 Apple의 새로운 .p8 인증서를 사용하는 방법 (0) | 2020.11.04 |
VSCode의 "저장시 형식"에서 파일을 제외하는 방법은 무엇입니까? (0) | 2020.11.04 |