加载一个 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;
});
多么优雅的解决方案,谢谢大家。
我是 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;
});
多么优雅的解决方案,谢谢大家。