2016-03-15 4 views
0

Я новичок в JavaScript/Node.js, и я пытаюсь изучить асинхронные вызовы и обратные вызовы.Загрузите модуль JavaScript, сохраните результат функции на переменной, а затем консольный журнал

Я написал следующий код (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, я могу Console- войдите в SteamID64.

Но я не хочу, чтобы консоль регистрировал результат из моего модуля. Теперь я хочу, чтобы код был выше из другого скрипта (test.js), сохранил результат в переменной и затем сделал что-то еще. Например, я могу выполнить консольный журнал из этого внешнего скрипта (test.js).

Так что, пожалуйста, как это сделать? Я подозреваю, что мне нужно каким-то образом экспортировать ценность JSON, которая меня интересует?

ответ

0

Вы должны просто вернуть обещание. Ваш модуль 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; 
    }); 
+0

Я решил использовать это предложение, но с небольшими изменениями. Таким образом, окончательный код выглядит так: –

0

Вы можете вернуть запрос-обещание от getSteamId64() и перейти к module.exports так можно назвать по требованию() к другому скрипту. Но вам нужно получить доступ к этому значению в другом скрипте, как о обещании.

Исходный код вы вывесили с незначительными изменениями:

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); 
}); 
+0

Я проверю и отправлю отчет –

0

Я закончил с использованием предложений 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; 
    }); 

Какое элегантное решение, спасибо, ребята.