Returning a value from callback function in Node.js
我在node.js中从回调函数返回值时遇到了一些小问题,我将尽可能简单地解释我的情况。假设我有一个片段,它获取URL并点击该URL并给出输出:
1 2 3 4 | urllib.request(urlToCall, { wd: 'nodejs' }, function (err, data, response) { var statusCode = response.statusCode; finalData = getResponseJson(statusCode, data.toString()); }); |
我尝试将其包装在函数中,并返回如下值:
1 2 3 4 5 6 7 | 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代码中,我有很多
1 2 3 4 5 6 7 | if(//somecondition) { urlToCall = //Url1; } else if(//someother condition) { urlToCall = //Url2; } else { urlToCall = //Url3; } |
问题是,
1 2 | response = doCall(urlToCall); console.log(response) //Prints undefined |
但如果我在
因为它的
第一,你的功能。通它一个回调函数:
1 2 3 4 5 6 7 | 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); }); } |
现在:
1 2 3 4 5 | var urlToCall ="http://myUrlToCall"; doCall(urlToCall, function(response){ // Here you have access to your variable console.log(response); }) |
"罗德里戈,张贴在评论是一个很好的资源。关于回调函数读取节点和他们如何工作。记住,它是异步的代码。
I am facing small trouble in returning a value from callback function in Node.js
这不是一个"小麻烦",它实际上是不可能的"回报"a值在传统的镰刀从异步功能。
因为你不能"返回值"你必须调用该函数需要一个你有价值的信息。显示你的名字"_已经回答的问题,但我想点出的是,在docall return返回的值是不是在传统的方式。你可以写为:docall后续
1 2 3 4 5 6 7 8 9 10 | 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; }); } |
如果你想要的是你的工作没有太多的代码修改。你可以尝试这个解决方案会摆脱这一回调代码和相同的流程:
在你使用的是你可以使用node.js,CO和CO的请求来达到同样的目标,没有回调问题。
基本上,你可以做这样的东西:
1 2 3 4 5 6 7 8 | 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; }); } |
然后,
1 2 | var response = yield doCall(urlToCall); //"yield" garuantees the callback finished. console.log(response) // The response will not be undefined anymore. |
通过这样做,我们等待直到完成回调函数,然后从它获得的价值。不知何故,它solves您的问题。
示例代码-一个node.js异步功能同步功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); } |