Еще один новичок Node.js, который его не получил - PullRequest
0 голосов
/ 03 декабря 2018

EDITED: скорректировал мой рассказ и попытался добавить вывод в код, как показывают примеры, но он не работает.Что я делаю не так?

Привет, эксперты или энтузиаст, превосходящий меня,

Вопрос в том, «как правильно получить вывод из асинхронной функции в node.js в качестве возврата».Все примеры говорят об этой загадочной функции обратного вызова, но в контексте моего кода я не вижу, как она применяется или реализуется.

Да, вопрос задавался много раз, если бы мне пришлось его задаватьопять же, потому что предоставленные объяснения не получили этого новичка к пониманию.Да, я потратил около 24 часов, пытаясь следовать примерам, документации и другим постам, но я не нашел ни одного, который бы объяснил достаточно ясно, чтобы я мог применить к своему коду.

КонцепцияАсинхронный имеет смысл, код выполняется, но, в этом случае, вызов https не имеет.Код не ждет звонка https.Вы должны каким-то образом получить результат после его завершения.Хотя я не нашел практичности этого, я уверен, что я буду продолжать, поскольку я продолжаю изучать, почему node.js особенный в этом смысле.Предполагая, что мое понимание в основном верно, мой вопрос остается прежним.Концепция - это одно, а приложение и синтаксис - другое.

Это, кажется, общий вопрос, с которым почти у каждого новичка возникают проблемы.

Пока что ни один из примеров или объяснений не проясняет, где и как с чем я работаю.Я понимаю, что есть дополнительные модули, которые обрабатывают их по-разному, но я полагаю, что не пойму «почему / как», как это применимо, пока не пойму это правильно.

Поскольку я новичок в node.js, не стесняйтесьподробнее о любом аспекте моего кода, который я хочу изучить.

Если кто-то найдет этот код, он получит данные от официального API Clash Royal, для которого вам необходимо зарегистрировать свой 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 голосов
/ 03 декабря 2018

я думаю, вы должны лучше понимать асинхронную природу узла, единственный способ вернуть значения в оператор вызывающей стороны - это использовать параметр функции или Async / Await с Promises API, посмотрите ниже.

´ // возврат из параметра функции

myAsyncFunction (function (value) {

console.log (value)})

// илис помощью API Promise let value = await myAsyncFunction () ´

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...