Development Tip

Node.js의 콜백 함수에서 값 반환

yourdevel 2020. 11. 4. 20:52
반응형

Node.js의 콜백 함수에서 값 반환


이 질문에 이미 답변이 있습니다.

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-elseurlToCall이 결정 되는 많은 진술 이 있기 때문입니다.

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

반응형