所以我一直在尝试从请求中设置一个全局变量,但似乎什么也没得到。我正在使用的代码
用于测试的用户名是username=
var forSearching = "test2";
var name = "";
console.log(forSearching);
request("http://mercsystem.esy.es/get.php?username=" + forSearching, function(err, res, body)
{
if (err) return console.error(err);
var main = JSON.parse(body);
if (main.success == "false")
{
message.reply("Sorry, invalid user!")
}
else
{
name = main.Username
}
});
答案 0 :(得分:0)
如果在设置值后立即插入console.log(name)
,您将看到该值设置得很好。
问题可能是时机问题。 request()
是一个异步操作。这意味着调用request()
启动异步操作,然后代码的其余部分继续运行完成,然后,在稍后的某个时间,将使用最终的异步结果调用回调。
虽然您没有显示尝试使用name
变量的位置,但您可能在调用回调之前检查此全局变量的值,因此在设置值之前。
在node.js中,您正在做的不是如何使用异步结果。它永远不会可靠(或根本不)。相反,使用异步结果的唯一地方是回调本身或从回调中调用的函数,并将结果传递给。
var forSearching = "test2";
console.log("begin");
request("http://mercsystem.esy.es/get.php?username=" + forSearching, function (err, res, body) {
console.log("in request() callback");
if (err) return console.error(err);
var main = JSON.parse(body);
if (main.success == "false") {
message.reply("Sorry, invalid user!")
} else {
var name = main.Username
console.log(name); // value shows fine here
// use the name variable here or call some function and pass
// the name variable to it
}
});
console.log("after request() call");
// You cannot use the name value here (even if it was in a global) because
// the async callback has not yet been called
如果您使用我已添加的console.log()
语句运行此代码,您会看到以下事件序列:
begin
after request() call
in request() callback
从此序列中,您可以看到request()
调用之后的代码在异步回调运行之前运行。因此,您无法在那里使用name
变量,即使它位于全局变量中。