长话短说,我对NodeJS很新,我试图在函数执行后更改变量,但是我不能像我想的那样返回结果。
app.get('/:steamid', function(req, res) {
var steamID;
var steamAvatarUrl;
var steamRegisterDate;
steamAPI.ResolveVanityURL(req.params.steamid, function(err, res) {
console.log('Steam64: ' + res); // <- this prints out my result
steamID = res;
});
steamAPI.getAvatarUrl(req.params.steamid, function(err, res) {
console.log('Avatar URL: ' + res); // <- this prints out my result
steamAvatarUrl = res;
});
steamAPI.memberSince(req.params.steamid, function(err, res) {
console.log('Registered: ' + res); // <- this prints out my result
steamRegisterDate = res;
});
console.log(steamID); //<--- This returns undefined
res.render('steamid.hbs', {
"title": steamID,
"avatarURL": steamAvatarUrl,
"registerDate": steamRegisterDate
});
});
帮助解决我如何实现这一目标的示例/解决方案将是惊人的。我是一个视觉学习者,所以请不要说&#34;使用这个或做那个&#34;没有给它某种例子或我老实说也不会得到它大声笑。
提前致谢。
答案 0 :(得分:1)
Javascript本质上是异步的,因此在获取数据之前,您尝试打印它。您可以在回调函数中编写console.log()。 或者请使用承诺。
答案 1 :(得分:0)
@Zenderx让breif这个。
Node.js是异步编程,如果你做任何I / O事件,如数据库调用,http,超时调用。 它然后在事件池中发送并按顺序执行。
查看评论一步一步发生的事情。 什么在你的代码中惹恼它。
这是你的api电话
app.get('/:steamid', function(req, res) {
// excution comes inside
var steamID;
// then you call an I/O event and iniallized streamID but what happen here is this ,
//this is I/O event so went to event loop for excution
steamAPI.ResolveVanityURL(req.params.steamid, function(err, res) {
console.log('Steam64: ' + res); // <- this prints out my result
steamID = res;
});
// while the block is in event loop or excution this statement run because of Async nature
console.log(steamID); //<--- This returns undefined
(...)
});
如果要打印StreamID,只能在块内打印。
steamAPI.ResolveVanityURL(req.params.steamid, function(err, res) {
console.log('Steam64: ' + res); // <- this prints out my result
steamID = res;
console.log(steamID);
});
为了深入研究异步,您可以在node.js中查看promise和async库。
对新手来说最简单的事就是这个。
app.get('/:steamid', function(req, res) {
var steamID;
var steamAvatarUrl;
var steamRegisterDate;
steamAPI.ResolveVanityURL(req.params.steamid, function(err, resu) {
console.log('Steam64: ' + resu); // <- this prints out my result
steamID = resu;
steamAPI.getAvatarUrl(req.params.steamid, function(err, resu) {
console.log('Avatar URL: ' + resu); // <- this prints out my result
steamAvatarUrl = resu;
steamAPI.registerDate(req.params.steamid, function(err, resu) {
console.log('Registered: ' + resu); // <- this prints out my result
steamRegisterDate = resu;
console.log(steamID); //<--- This returns undefined
res.render('steamid.hbs', {
"title": steamID,
"avatarURL": steamAvatarUrl,
"registerDate": steamRegisterDate
});
});
});
});
});
如果您需要通过promise和异步模块ping来解决它。
答案 2 :(得分:0)
Javascript本质上是异步的。函数'steamAPI.ResolveVanityURL()'需要时间来执行,因此在等待结果之前,下一个语句'console.log(steamID)'正在执行。
您可以使用回调或以下是使用'q'保证库来解决问题的示例 -
var Q = require('q');
app.get('/:steamid', function(req, res) {
var steamID;
resolveUrl(req.params.steamid).then(function(steamID) {
console.log(steamID); //<--- This will return steamID
(...)
});
});
function resolveUrl(id) {
var deferred = Q.defer();
steamAPI.ResolveVanityURL(id, function(err, res) {
console.log('Steam64: ' + res); // <- this prints out my result
deferred.resolve(res);
});
return deferred.promise;
}
这里有一个链接,可以获得有关node.js中的promises的更多信息 - http://www.dotnetcurry.com/nodejs/1242/promises-nodejs-using-q-goodbye-callbacks
希望这能解决你的问题。
答案 3 :(得分:0)
您可以使用Promise解决此问题。你的api电话是异步的。所以它不会等待完成api调用。它只是执行console.log()。这就是你未定义的原因。我不确定您的节点版本。如果承诺不可用,您可以使用bluebird库。
app.get('/:steamid', function(req, res) {
var steamID;
new Promise(function(resolve, reject){
steamAPI.ResolveVanityURL(req.params.steamid, function(err, res) {
resolve(res);
});
}).then(function(res){
steamID = res;
console.log('Steam64: ' + steamId);
}
});
答案 4 :(得分:0)
默认情况下,Javascript是异步的。你不能在回调函数中返回一个值也不能在外部分配一个变量,因为它会立即返回。
app.get('/:steamid', function(req, res) {
steamAPI.ResolveVanityURL(req.params.steamid, function(err, res) {
console.log('Steam64: ' + res); // <- this prints out my result
var steamID = res;
console.log(steamID); // <-- defined
});
});
您可以了解Promise以及它们如何工作,因为它们更倾向于使用回调。