另一个不懂的Node.js新手

时间:2018-12-02 22:28:28

标签: node.js asynchronous callback

已编辑:调整了我的叙述,并尝试将输出添加到代码中,如示例所示,但这不起作用。我在做什么错了?

您好,我的专家或发烧友,

问题是“如何正确地从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);
};

1 个答案:

答案 0 :(得分:-1)

我认为您应该更好地理解node的异步性质,将值返回到调用方语句的唯一方法是使用函数参数或带有Promises API的Async / Await,请看下面。

´ //从函数参数返回

myAsyncFunction(function(value){

console.log(值) })

//或使用Promise API 让值=等待myAsyncFunction()´