我在从 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的值将被决定,如下所示:

if(//somecondition) {
   urlToCall = //Url1;
} else if(//someother condition) {
   urlToCall = //Url2;
} else {
   urlToCall = //Url3;
}

问题是,urllib.request中的所有语句都将保持不变,除了urlToCall的值.所以我肯定需要把这些通用代码放在一个函数中.我也try 过同样的方法,但在doCall中,我总是会返回undefined.我试着这样:

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

但如果我把值打印在doCall()以内,它打印得很完美,但它总是返回undefined.根据我的研究,我知道我们不能从回调函数返回值!(这是真的吗)?如果是的话,有谁能告诉我如何处理这种情况,因为我希望在每if-else个块中防止重复代码.

推荐答案

它是undefined,因为在doCall(urlToCall);完成之前有console.log(response)次.您还必须传入一个回调函数,当您的任务完成时,该函数将运行.

首先,你的功能.给它回拨:

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

@罗德里戈在 comments 中打出了good resource分.阅读node中的callbacks及其工作原理.记住,这是异步代码.

Node.js相关问答推荐

无法验证叶签名|无法验证第一个证书

如何使用jq将依赖项添加到package.json中

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

为什么我的过滤器无法在我在下面编写的 Google Analytics 4 应用程序脚本代码中工作?我该如何修复它?

如何在docker容器上正确安装nodejs?

GitLab 依赖扫描需要源代码中的 package-lock.json 才能执行

TypeScript Eslint警告了一个AWS客户端构造函数(dynamodb),但没有警告另一个(s3)

npm 在 Windows 终端中不工作

使用 Nodejs 获取 Firebase 云消息传递历史记录

如何删除mongodb中嵌套数组中所有出现的数组元素

在数组的另一个对象中获取数组的mongoose 对象

即使部署成功,也不会触发 Firebase 函数来填充 Firestore 集合.为什么?

为什么在调用数据库调用时我的参数没有定义?

Cypress net::ERR_EMPTY_RESPONSE 在真实服务器调用上

为什么 req.params.id 返回 undefined未定义?

编写可维护的事件驱动代码

NODEJS 进程信息

已安装全局 NPM 包但未找到命令

为什么我会收到错误:解决方法指定过多?

安装Node.js 安装n 安装Node.js?