我在从 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相关问答推荐

如何在.npmrc中添加 comments ?

如何在Sequelize with Postgres中将m:n关联表ID从整数迁移到UUID?

下一个API路由如何处理多个并发请求?

通过PutObjectCommand上传AWS S3 PDF文件,结果为空PDF

使用AWS SDK for JavaScript V3将图像从node.js上传到s3 bucket

FHIR 服务器:尽管 JSON 格式正确,但在 POST 请求中接收未定义请求正文

使用 axios 和 Cheerio (Node js) 抓取 google 搜索

安装样式组件时出现react 错误

如何在带有 JS 的 Nodejs 中使用没有 Async 方法的 Await

Next.js 在我的电脑上没有构建错误,但它们在使用 Vercel 部署时发生

如何使用 superagent/supertest 链接 http 调用?

来自 Node-aws 的 Dynamo Local:所有操作都失败无法对不存在的表执行操作

如何从 Redis 保存和检索会话

将 myproject/.npmrc 与注册表一起使用

如何将`yarn.lock`与`package.json`同步?

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

Node.js 应用程序有周期性的缓慢和/或超时(不接受传入的请求)

Node.js `--nolazy` 标志是什么意思?

使用 node.js 循环 JSON

将 NodeJS 用于大型项目