我在从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将决定value的值,例如:
if-else
urlToCall
if(//somecondition) { urlToCall = //Url1; } else if(//someother condition) { urlToCall = //Url2; } else { urlToCall = //Url3; }
关键是a内的所有语句urllib.request将保持相同,除了的值urlToCall。因此,绝对需要将这些通用代码放入函数中。我尝试了同样的方法,但是indoCall总是会回报我undefined。我这样尝试过:
urllib.request
doCall
undefined
response = doCall(urlToCall); console.log(response) //Prints undefined
但是,如果我在doCall()其中打印值,则可以完美打印,但始终会返回undefined。根据我的研究,我知道我们无法从回调函数返回值!(是真的)吗?如果是,那么任何人都可以建议我如何处理这种情况,因为我想防止每个if- else块中都有重复的代码。
doCall()
if- else
其undefined原因是,console.log(response)运行doCall(urlToCall);完毕。您还必须传递一个回调函数,该回调函数在您的 请求 完成时运行。
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,在评论中发布了很好的资源。阅读有关节点中的 回调 及其工作方式的信息。请记住,它是异步代码。