2016-11-18 8 views
0

私は約束を返す関数を持っています。約束の最初のブロックで、私はXMLをいくつか取り出し、それをfeed.xmlというファイルに書き出します。次に、次のブロックで、そのXMLをJSONに変換します。ここでの問題は、ファイルがシステムに書き込まれる前に、関数がxmlファイルをJSONに変換しようとしていることです。最初のブロックで2番目のブロックを待機させるにはどうすればよいですか?あなたの要求が完了する前に、あなたが解決しているJS Promiseを使用して非同期呼び出しを処理する方法は?

var out = fs.createWriteStream('./feed.xml'); 

var fetchJSON =() => { 
    return new Promise((resolve, reject) => { 

    var feedURL = 'http://www2.jobs2careers.com/feed.php?id=1237-2595&c=1&pass=HeahE0W1ecAkkF0l'; 
    request(feedURL).pipe(zlib.createGunzip()).pipe(out); 
    resolve(); 

    }).then(() => { 

    fs.readFile('feed.xml', function(err, data) { 
     parser.parseString(data, function(err, result) { 
     console.log(result); 
     }); 
    }); 

    }); 
}; 

fetchJSON(); 
+0

(request(feedURL).pipe(zlib.createGunzip())。pipe(out));解決する必要があります。 – Hosar

答えて

3

は、ここに私の関数です。

request(feedURL).pipe(zlib.createGunzip()).pipe(out); 
resolve(); 

ストリームの作成が完了したらすぐに解決する必要があります。あなたは、これは、ストリームが完了するまで、あなたの約束が解決されないことを意味https://nodejs.org/api/stream.html#stream_event_finish

var stream = request(feedURL).pipe(zlib.createGunzip()).pipe(out); 

stream.on('finish', function() { 
    resolve(); 
}); 

ストリームfinishイベントで聴くことができます。

+0

私はこの方法を試しましたが、私はまだ "then"ブロックのコンソールに未定義でログを記録しています。 feed.xmlという名前のxmlにデータが含まれていることを確認しました。参照しているXMLファイルを表示するには、私の編集したコードを見てください。途中で何かが間違っている。 – Mjuice

+1

おそらくもっと良い選択肢は、データをファイルに書き込むのではなく、プロミスの解像度で渡すことです。本当にファイルが必要な場合を除きます。 –

+0

[OK]を、私はこのような変数と呼ばれるXMLに結果のデータを設定してみました: するvar feedURL =「http://www2.jobs2careers.com/feed.php?id=1237-2595&c=1&pass=HeahE0W1ecAkkF0l」; var xml = request(feedURL).pipe(zlib.createGunzip()); 私はconsole.logged xmlであり、xmlではなくgunZipファイルです。私はまだこれについて少し混乱しています。 – Mjuice

関連する問題