如何使用JS Promise处理异步调用?

时间:2016-11-18 00:45:40

标签: javascript es6-promise

我有一个返回承诺的函数。在promise的第一个块中,我获取了一些XML并将其写入名为feed.xml的文件中。然后,在下一个块中,我将该XML转换为JSON。这里的问题是我的函数在文件写完我的系统之前尝试将xml文件转换为JSON。如何让第二个块在第一个块上等待?

这是我的功能:

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();

1 个答案:

答案 0 :(得分:3)

在您的请求完成之前,您已经解决了问题。

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

您应该在流完成后解决,而不是在创建后立即解决。您可以收听视频流finish事件https://nodejs.org/api/stream.html#stream_event_finish

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

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

这意味着您的承诺在流完成之前不会得到解决。