已编辑:调整了我的叙述,并尝试将输出添加到代码中,如示例所示,但这不起作用。我在做什么错了?
您好,我的专家或发烧友,
问题是“如何正确地从node.js中的异步函数获取输出作为返回”。这些示例都谈到了这个神秘的回调函数,但是在我的代码上下文中,我看不到它是如何应用或实现的。
是的,这个问题已经问了很多遍了,如果我不得不再问一次,那是因为所提供的解释并没有使这个新手理解。是的,我花了将近24个小时左右的时间来尝试阅读示例,文档和其他文章,但是我没有找到足够清楚地说明我可以将其应用于我的代码的人。
异步的概念很有意义,代码可以运行,但是在这种情况下,https调用没有。该代码不等待https调用。完成结果后,您必须以某种方式获取结果。尽管我还没有发现它的实用性,但是我相信我会继续学习为什么node.js如此特别的原因。假设我的理解基本上是正确的,那么我的问题仍然是一样的。概念是一回事,应用程序和语法是另一回事。
这似乎是一个常见问题,几乎每个新手都会遇到麻烦。
因此,到目前为止,这些示例或解释似乎都无法阐明我在哪里或如何使用我的工具。我知道还有其他模块可以不同地处理这些问题,但是除非相信正确,否则我相信我不会理解其中的“为什么/如何”。
由于我是node.js的新手,所以我随时可以学习我的代码的任何方面。
如果有人发现了此代码,则此代码将从官方的Clash Royal API中获取数据,您需要为其注册IP并从https://developer.clashroyale.com获取令牌。
app.js
require('dotenv').config();
var func = require('./functions.js');
console.log(func.uChests(process.env.MyPlayer)); //this should output the value
functions.js
require('dotenv').config();
//console.log('Loaded Functions')
module.exports.uChests = func_uChests
//Clearly wrong application
//function func_uChests (playerID) {
function func_uChests (playerID,output) {
//console.log('uChests')
var http = require("https");
var options = {
"method": "GET",
"hostname": "api.clashroyale.com",
"port": null,
"path": "/v1/players/%23"+ playerID + "/upcomingchests",
"headers": {
"content-length": "0",
"authorization": "Bearer " + process.env.Token,
"accept": "application/json"
}
};
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
/* example output
{"items":[{"index":0,"name":"Magical Chest"},{"index":1,"name":"Silver Chest"},{"index":2,"name":"Silver Chest"},{"index":3,"name":"Golden Chest"},{"index":4,"name":"Silver Chest"},{"index":5,"name":"Silver Chest"},{"index":6,"name":"Silver Chest"},{"index":7,"name":"Golden Chest"},{"index":8,"name":"Silver Chest"},{"index":22,"name":"Legendary Chest"},{"index":40,"name":"Giant Chest"},{"index":76,"name":"Super Magical Chest"},{"index":77,"name":"Epic Chest"}]}
{"items":[{"index":0,"name":"Magical Chest"},{"index":1,"name":"Silver Chest"},{"index":2,"name":"Silver Chest"},{"index":3,"name":"Golden Chest"},{"index":4,"name":"Silver Chest"},{"index":5,"name":"Silver Chest"},{"index":6,"name":"Silver Chest"},{"index":7,"name":"Golden Chest"},{"index":8,"name":"Silver Chest"},{"index":22,"name":"Legendary Chest"},{"index":40,"name":"Giant Chest"},{"index":76,"name":"Super Magical Chest"},{"index":77,"name":"Epic Chest"}]}
*/
});
});
req.end();
}
//Clearly wrong application
function uChests(input, output) {
func_uChests(input, output);
console.log(output);
};
答案 0 :(得分:-1)
我认为您应该更好地理解node的异步性质,将值返回到调用方语句的唯一方法是使用函数参数或带有Promises API的Async / Await,请看下面。
´ //从函数参数返回
myAsyncFunction(function(value){
console.log(值) })
//或使用Promise API 让值=等待myAsyncFunction()´