一尘不染

从Node.js中的回调函数返回值

node.js

我在从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(//somecondition) {
   urlToCall = //Url1;
} else if(//someother condition) {
   urlToCall = //Url2;
} else {
   urlToCall = //Url3;
}

关键是a内的所有语句urllib.request将保持相同,除了的值urlToCall。因此,绝对需要将这些通用代码放入函数中。我尝试了同样的方法,但是indoCall总是会回报我undefined。我这样尝试过:

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

但是,如果我在doCall()其中打印值,则可以完美打印,但始终会返回undefined。根据我的研究,我知道我们无法从回调函数返回值!(是真的)吗?如果是,那么任何人都可以建议我如何处理这种情况,因为我想防止每个if- else块中都有重复的代码。


阅读 1014

收藏
2020-07-07

共1个答案

一尘不染

undefined原因是,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,在评论中发布了很好的资源。阅读有关节点中的 回调 及其工作方式的信息。请记住,它是异步代码。

2020-07-07