如何使用 JS Promise 处理异步调用?
How to handle asynchronous calls using a JS Promise?
我有一个 returns 承诺的功能。在 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();
});
这意味着您的承诺在流完成之前不会得到解决。
我有一个 returns 承诺的功能。在 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();
});
这意味着您的承诺在流完成之前不会得到解决。