#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 пожалуйста, отметьте ответ как правильный.