关于javascript:从Node.js中的回调函数返回一个值

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代码中,我有很多if-else语句,其中urlToCall的值将被决定,如下所示:

1
2
3
4
5
6
7
if(//somecondition) {
   urlToCall = //Url1;
} else if(//someother condition) {
   urlToCall = //Url2;
} else {
   urlToCall = //Url3;
}

问题是,urllib.request中的所有语句都将保持不变,但urlToCall的值除外。所以我需要把这些公共代码放到一个函数中。我也试过同样的方法,但在江户记1〔4〕里,江户记1〔5〕总是会还给我。我试过这样:

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

但如果我在doCall()中打印值,它会完美打印,但它总是返回undefined。根据我的研究,我开始知道我们不能从回调函数返回值!(这是真的吗?)如果是,是否有人建议我如何处理这种情况,因为我想防止每个if-else块中出现重复代码。


因为它的undefineddoCall(urlToCall);是完成之前,console.log(response)挤兑。你有你的护照在一个回调函数,当你请求运行的自然,这是完成。

第一,你的功能。通它一个回调函数:

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

callback(finalData);就是电话线的功能是有价值的,你需要从异步功能。但意识到的返回语句的功能是用来表明的是,在这里结束,但这并不意味着价值的是返回到来电(来电显示在移动。)


如果你想要的是你的工作没有太多的代码修改。你可以尝试这个解决方案会摆脱这一回调代码和相同的流程:

在你使用的是你可以使用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);
}