如何使用JS承诺处理异步调用

How to handle asynchronous calls using a JS Promise?

本文关键字:异步 调用 处理 承诺 何使用 JS      更新时间:2023-09-26

我有一个返回承诺的函数。在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();

在请求完成之前您正在解析。

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

这意味着你的承诺在流完成之前不会被解析。