2017-08-08 6 views
1

私はnodejsを初めて使っています。モジュールエクスポート変数が空であるのはなぜですか?

ここに私の.jsファイルがあります。私は他の関数にaudioData変数を公開しようとしています。 audioData変数の値が関数外で空になっています。私は、その関数の中で印刷するときの値を見ます。何が間違っていますか?

'use strict'; 
var asyncrequest = require('request'); 
var xml2js = require('xml2js'); 
var parseString = xml2js.parseString; 
var audioData = []; 

asyncrequest("http://example.com/feed", function(error, responsemeta, body) { 

    parseString(body, function(err, result){ 
      var stories = result['rss']['channel'][0]['item']; 

      console.log("Total stories: " + stories.length); 

      stories.forEach(function(entry) { 
       var singleObj = {} 
       singleObj['title'] = entry['title'][0]; 
       singleObj['value'] = entry['enclosure'][0].$.url; 
       audioData.push(singleObj); 
      }); 
    }); 
    console.dir(audioData); 
}); 

module.exports = audioData; 
console.log("Program ended"); 
+1

「audioData」を変更する非同期要求を実行しています。この要求は、変数がエクスポートされた後に*実行されます。したがって、 'require'を使ったインポートは空の配列を取得します。要求が完了するまで空のままです。 – heartyporridge

+0

@heartyporridge IIRC 'require()'は同期式なので、空の配列をエクスポートした後も、リクエストが完了してもそのままになります – spicypumpkin

+0

@spicypumpkin Hm ...参照を返すのは 'require'しませんか?もし私が間違っていればそれを修正してください。 ...それぞれの 'require'はエクスポートされた変数の一意のスコープを生成しますか? – heartyporridge

答えて

0

audioDataではなく約束を返す必要があります。他の約束についてもっと知ることができます。幸いにも、あなたがそうのように使用することができ、要求、要求、約束のpromisifiedバージョンがあります:

'use strict'; 

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

var promiseForAudioData = rp('http://example.com/feed') 
    .then(body => { 
    parseString(body, function(err, result){ 
     var stories = result['rss']['channel'][0]['item']; 
     console.log("Total stories: " + stories.length); 

     stories.forEach(function(entry) { 
     var singleObj = {} 
     singleObj['title'] = entry['title'][0]; 
     singleObj['value'] = entry['enclosure'][0].$.url; 
     audioData.push(singleObj); 
     }); 
    }); 

    return audioData; 
    }) 
    .catch(console.error.bind(console)); 

module.exports = promiseForAudioData; 
console.log("Program ended"); 
0

あなたが約束を使用したくない場合は、どちらかのコールバック内部の輸出やリクエストメソッド自体をエクスポートすることができます。

asyncrequest("http://example.com/feed", function(error, responsemeta, body) { 

    parseString(body, function(err, result){ 

    var stories = result['rss']['channel'][0]['item'];  
    console.log("Total stories: " + stories.length); 
    stories.forEach(function(entry) { 
     var singleObj = {} 
     singleObj['title'] = entry['title'][0]; 
     singleObj['value'] = entry['enclosure'][0].$.url; audioData.push(singleObj); 
    }); 
    module.exports = audioData; 

    }); 

}); 

// Or 
exports.get = function (callback) { 
    return asyncrequest(/* ... */, callback); 
} 

// Other module 
require("./module").get(function (audioData) { 
    /* Do something */ 
}) 
関連する問題