Я думаю, что я запутался в области JavaScript. Когда я попытался выполнить следующий код (используя Node.js), я не смог получить какой-либо вывод из второго "console.log()". В этой программе, я думаю, значение переменной должно иметь некоторое значение после выполнения http.get(), поскольку переменная value находится в глобальной области. Но возвращаемое значение против моего ожидания.
var http = require('http');
var options = {
host: "www.example.com",
path: "/index.html",
port: 80
};
var value = "";
var ret = http.get(options, function(res) {
res.on("data", function(chunk) {
value += chunk;
});
res.on("end", function(chunk) {
console.log(value); // have some value...
})
});
console.log(value); // don't have any value...why?
Я хотел бы знать, что происходит. Заранее спасибо!
(следующий текст является дополнением)
Большое спасибо трем парням, которые дали мне ответ! Я задерживал выполнение второй console.log(), используя setTimeout следующим образом. Но у меня все еще такая же проблема. Интересно, как я могу получить ценность.
var http = require('http');
var options = {
host: "www.example.com",
path: "/index.html",
port: 80
};
var value = "";
var ret = http.get(options, function(res) {
res.on("data", function(chunk) {
value += chunk;
});
res.on("end", function(chunk) {
console.log("first: " + value); // have some value...
})
});
setTimeout(function() {
console.log("second: " + value); // don't have any value...why?
}, 5000);
Вы определяете функцию обратного вызова на http.get
, а затем выполняете ее, поэтому, выполняя конечное значение console.log
, устанавливается value
BEFORE. Тем временем, я не знаю, вызван ли ваш обратный вызов. Попробуйте добавить некоторые дополнительные инструкции console.log
чтобы убедиться, что ваш поток выполнения - это то, что вы ожидаете.
Ключ здесь - асинхронные обратные вызовы.
Случается, что function(res) {...}
вызывается и когда http.get
завершается, и там она добавит значения к value
. Однако после http.get
он будет регистрировать value
когда оно еще не заполнено.
Таким образом,
http.get
console.log
называетсяhttp.get
закончен, function(res) {...}
вызывается HTTP-запрос является асинхронным. Вторая консоль.log() (где value
переменной не имеет значения) на самом деле вызывается перед возвратом запроса и, следовательно, имеет то же значение, с которой она была инициализирована.