加载一个 JavaScript 模块,将函数结果存储在变量上,然后是控制台日志

Load a JavaScript module, store function result on variable and then console log

我是 JavaScript/Node.js 的新手,我正在尝试学习异步调用和回调。

我写了下面的代码(steamid64.js):

var rp = require('request-promise');
var parseString = require('xml2js').parseString;

var username = 'yllanos';

function getSteamID64(URL) {
  rp(URL)
      .then(function (xml) {
          parseString(xml, { explicitArray : false, ignoreAttrs : true, trim : true }, function(err, result){
          json = result;
      });
      console.log(json["profile"]["steamID64"]);

      })
      .catch(function (reason) {
        console.error("%s; %s", reason.error.message, reason.options.url);
        console.log("%j", reason.response.statusCode);
        return reason.error.message;
      });
}

exports.get = getSteamID64;

getSteamID64("http://steamcommunity.com/id/" + username +  "/?xml=1");

模块代码转到 Steam,为该用户获取 XML,将其转换为 JSON,仅使用 customURL,我可以控制台登录 SteamID64。

但我真的不想控制台记录我模块的结果。我现在想要的是从另一个脚本 (test.js) 获取上面的代码,将结果存储在一个变量中,然后执行其他操作。例如,我可以从此外部脚本 (test.js).

进行控制台日志

请问我该怎么做?我怀疑我应该以某种方式导出我感兴趣的 JSON 值?

你应该 return 承诺。您的 steamid64.js 模块应如下所示

var rp = require('request-promise');
var parseString = require('xml2js').parseString;

var username = 'yllanos';

module.exports = function getSteamID64(URL) {
  return rp(URL)
    .then(function (xml) {
      return new Promise(function(resolve, reject) {
        parseString(xml, {
          explicitArray : false,
          ignoreAttrs : true,
          trim : true
        }, function(err, result){
          if (err) {
            reject(err);
          } else {
            resolve(result);
          }
        });
      });
    });
}

然后在test.js

var getSteamID64 = require('steamdid64');

getSteamID64("http://steamcommunity.com/id/" + username +  "/?xml=1")
  .then(function (result) {
    console.log(result);
  })
  .catch(function (reason) {
    console.error("%s; %s", reason.error.message, reason.options.url);
    console.log("%j", reason.response.statusCode);
    return reason.error.message;
  });

您可以 return 来自 getSteamId64() 的请求承诺并传递给 module.exports,这样它就可以在另一个脚本上被 require() 调用。但是您也必须像承诺一样在其他脚本中访问该值。

您发布的原始代码稍有改动:

function getSteamID64(URL, cb) {
  return rp(URL)
      .then(function (xml) {
          parseString(xml, { explicitArray : false, ignoreAttrs : true, trim : true }, function(err, result){
          json = result;
      });
      return json["profile"]["steamID64"];
      })
      .catch(function (reason) {
        console.error("%s; %s", reason.error.message, reason.options.url);
        console.log("%j", reason.response.statusCode);
        return reason.error.message;
      });
}

module.exports = getSteamID64("http://steamcommunity.com/id/" + username +  "/?xml=1");

和另一个这样的脚本:

var steamid = require('./steamid64.js');

steamid.then(function(x){
    console.log("steamid:"+x);
});

我最终采用了 gabesoft 的建议。最终代码如下所示:

(steamid64.js):

var rp = require('request-promise');
var parseString = require('xml2js').parseString;

module.exports = function getSteamID64(URL) {
  return rp(URL)
    .then(function (xml) {
      return new Promise(function(resolve, reject) {
        parseString(xml, {
          explicitArray : false,
          ignoreAttrs : true,
          trim : true
        }, function(err, result){
          if (err) {
            reject(err);
          } else {
            resolve(result);
          }
        });
      });
});
}

然后 (test.js):

var getSteamID64 = require('./steamid64');

var username = 'yllanos';

getSteamID64("http://steamcommunity.com/id/" + username +  "/?xml=1")
  .then(function (result) {
    console.log(result["profile"]["steamID64"]);
  })
  .catch(function (reason) {
    console.error("%s; %s", reason.error.message, reason.options.url);
    console.log("%j", reason.response.statusCode);
    return reason.error.message;
  });

多么优雅的解决方案,谢谢大家。