在Node.js中从回调函数返回一个值
这个问题在这里已经有了答案:
它的undefined
因为, console.log(response)
在doCall(urlToCall);
之前运行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;
});
}
线路callback(finalData);
是什么调用需要从异步函数获得的值的函数。 但请注意,return语句用于指示该函数在此处结束,但并不意味着该值将返回给调用方(调用方已经继续)。
如果你想要的是让你的代码工作而不用修改太多。 你可以尝试这个解决方案,它可以摆脱回调并保持相同的代码工作流程 :
鉴于您正在使用Node.js,您可以使用co和co-request来实现相同的目标,而无需回调问题。
基本上,你可以做这样的事情:
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;
});
}
然后,
var response = yield doCall(urlToCall); // "yield" garuantees the callback finished.
console.log(response) // The response will not be undefined anymore.
通过这样做,我们等待回调函数完成,然后从中获取值。 不知何故,它解决了你的问题。
链接地址: http://www.djcxy.com/p/9473.html上一篇: Returning a value from callback function in Node.js
下一篇: Loggin in users with Spotify account with the Spotify API