如何使用JS承诺处理异步调用
How to handle asynchronous calls using a JS 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();
在请求完成之前您正在解析。
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();
});
这意味着你的承诺在流完成之前不会被解析。
相关文章:
- 如何使用异步调用更改工厂的变量
- 使变量可用于不带闭包的异步调用
- 需要收集Javascript nodejs异步调用
- 如何使用jQuery等待来自回调的异步调用
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 在forEach内部进行异步调用
- jQuery没有指定异步调用级别async:false
- SPA异步调用在IE 11中不起作用
- Ember.js-模型find()方法中的异步调用
- Javascript/JQuery处理并发/异步调用和数据竞争
- 在异步调用返回之前隐藏页面
- ExtJs 处理异步调用
- ES6:在异步调用中使用生成器
- Angular js - 异步调用 $scope.users 后不更新模态值
- 在每个循环上完成异步调用,然后转到下一个节点 js
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- 使用 AngularJS 的异步调用
- 循环内部的Javascript异步调用
- 使用Canvas和ForEach处理异步调用
- JavaScript/promise,对sharepoint的多个异步调用