JS присваивает var из http.get

#javascript #node.js

#javascript #node.js

Вопрос:

пытаюсь присвоить данные json глобальным переменным js… почему это не работает … пробовал использовать выборку, и этот http.get продолжает оставаться неопределенным для глобальных переменных при консоли.журнал отображает их какую-либо помощь?

 
var https=require('https');
var testUrl="https://tools.learningcontainer.com/sample-json.json"
var firstName=""
var lastName=""
var age=0
function getNews(url1) {
var request = https.get(url1, function(response) {
    // console.log(response.statusCode); // for testing to see the status code
    var body = ''; // start with an empty body since node gets responses in chunks

    // Read the data
    response.on('data', function(chunk) {
    body  = chunk;
             });
    
    response.on('end', function() {
    if ( response.statusCode === 200 ) {
       data=JSON.parse(body)
       //console.log(data)
        }
       assignData(data)  
    })
})
}

function assignData(data) { // function to process data
firstName=data.firstName
lastName=data.lastName
age=data.age
console.log(firstName,lastName,age)
}
    
getNews(testUrl);
console.log(firstName,lastName,age)
 

Ответ №1:

Вам нужно подождать, пока все данные не будут получены и обработаны.

Вы можете использовать, например, «await / async»…

В демонстрационных целях я установил простой тайм-аут в конце.

     var https = require('https');
    var testUrl = "https://tools.learningcontainer.com/sample-json.json"
    var firstName = ""
    var lastName = ""
    var age = 0
    function getNews(url1) {
        var request = https.get(url1, function (response) {
            // console.log(response.statusCode); // for testing to see the status code
            var body = ''; // start with an empty body since node gets responses in chunks
    
            // Read the data
            response.on('data', function (chunk) {
                body  = chunk;
            });
    
            response.on('end', function () {
                if (response.statusCode === 200) {
                    data = JSON.parse(body)
                    //console.log('[response]',data)
                }
                assignData(data)
            })
        })
    }
    
    function assignData(data) { // function to process data
        firstName = data.firstName
        lastName = data.lastName
        age = data.age
        console.log('[assignData]', firstName, lastName, age)
    }
    
    getNews(testUrl);
    
console.log('[resultToEarly]', firstName, lastName, age)

setTimeout(function() {
    console.log('[resultAfterWaiting]', firstName, lastName, age)
    }, 3000);
 

Ответ №2:

https.get это асинхронная функция, чтобы заставить ее выполнить некоторый код после его завершения, вам придется прибегнуть к старому доброму обратному вызову. Теперь, поскольку вы выполнили его внутри другой функции, чтобы выполнить некоторый код после того, как эта функция будет выполнена с запросом, вам нужно будет обернуть вызов http.get в обещание и дождаться его завершения, а затем выполнить любой код, который вы хотите после getNews() вызова в IIFE.

Взгляните:

 var testUrl = "https://tools.learningcontainer.com/sample-json.json"
var firstName = ""
var lastName = ""
var age = 0
function getNews(url1) {
    return new Promise(
        (resolve, reject) => {
            https.get(url1, function (response) {
                // console.log(response.statusCode); // for testing to see the status code
                var body = ''; // start with an empty body since node gets responses in chunks
        
        
                // Read the data
                response.on('data', function (chunk) {
                    body  = chunk;
                });
        
                response.on('end', function () {
                    if (response.statusCode === 200) {
                        data = JSON.parse(body);
                        //    console.log(data)
                        assignData(data);
                    }
                    resolve();
                });

                response.on('error', function () {
                    reject(error);
                })
            })
        }
    )
}

function assignData(data) { // function to process data
    firstName = data.firstName
    lastName = data.lastName
    age = data.age
    // console.log(firstName,lastName,age)
}

(async function(){
    await getNews(testUrl);
    console.log(firstName, lastName, age)
})();
 

Комментарии:

1. @MattT пожалуйста, отметьте ответ как правильный.