Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 354 Vote(s) - 3.73 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Returning a value from callback function in Node.js

#1
I am facing small trouble in returning a value from callback function in Node.js, I will try to explain my situation as easy as possible. Consider I have a snippet, which takes URL and hits that url and gives the output:

urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
});

I tried to wrap it inside a function and return a value like this:

function doCall(urlToCall) {
urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) {
var statusCode = response.statusCode;
finalData = getResponseJson(statusCode, data.toString());
return finalData;
});
}

Because in my Node.js code, I have a lot of `if-else` statement where value of `urlToCall` will be decided, like this:

if(//somecondition) {
urlToCall = //Url1;
} else if(//someother condition) {
urlToCall = //Url2;
} else {
urlToCall = //Url3;
}

The thing is all of the statements inside a `urllib.request` will remain same, except value of `urlToCall`. So definitely I need to put those common code inside a function. I tried the same but in `doCall` will always return me `undefined`. I tried like this:

response = doCall(urlToCall);
console.log(response) //Prints undefined

But if I print value inside `doCall()` it prints perfectly, but it will always return `undefined`. As per my research I came to know that we cannot return values from callback functions! (is it true)? If yes, can anyone advice me how to handle this situation, as I want to prevent duplicate code in every `if-else` blocks.

Reply

#2
Its `undefined` because, `console.log(response)` runs before `doCall(urlToCall);` is finished. You have to pass in a callback function aswell, that runs when your _request_ is done.

First, your function. Pass it a callback:

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);
});
}

Now:

var urlToCall = "http://myUrlToCall";
doCall(urlToCall, function(response){
// Here you have access to your variable
console.log(response);
})

@Rodrigo, posted a [good resource](

[To see links please register here]

) in the comments. Read about _callbacks_ in node and how they work. Remember, it is asynchronous code.
Reply

#3
> I am facing small trouble in returning a value from callback function in Node.js

This is not a "small trouble", it is actually impossible to "return" a value in the traditional sense from an asynchronous function.

Since you cannot "return the value" you must call the function that will need the value once you have it. @display_name already answered your question, but I just wanted to point out that the return in doCall is **not returning the value** in the traditional way. You could write doCall as follow:

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.)
Reply

#4
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][1] and [co-request][2] 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.
[1]:

[To see links please register here]

[2]:

[To see links please register here]

Reply

#5
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);
}
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through