NodeJS从函数

时间:2017-11-14 06:05:07

标签: javascript node.js function variables

长话短说,我对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;没有给它某种例子或我老实说也不会得到它大声笑。

提前致谢。

5 个答案:

答案 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以及它们如何工作,因为它们更倾向于使用回调。