【发布时间】:2017-11-16 23:22:04
【问题描述】:
我正在努力理解承诺,我想我可以看到它们是如何工作的,例如你可以说做Step 1、Step 2 然后Step 3。
我使用node-fetch(使用原生 Promises)创建了这个下载功能
## FileDownload.js
const fetch = require('node-fetch');
const fs = require('fs');
module.exports = function(url, target) {
fetch(url)
.then(function(res) {
var dest = fs.createWriteStream(target);
res.body.pipe(dest);
}).then(function(){
console.log(`File saved at ${target}`)
}).catch(function(err){
console.log(err)
});
}
所以这一切都是按顺序执行的,我可以看到它是如何工作的。
我有另一种方法可以将 CSV 文件转换为 JSON(再次使用 Promise)
## CSVToJson.js
const csvjson = require('csvjson');
const fs = require('fs');
const write_file = require('../helpers/WriteToFile');
function csvToJson(csv_file, json_path) {
return new Promise(function(resolve, reject) {
fs.readFile(csv_file, function(err, data){
if (err)
reject(err);
else
var data = data.toString();
var options = {
delimiter : ',',
quote : '"'
};
const json_data = csvjson.toObject(data, options);
write_file(json_path, json_data)
resolve(data);
});
});
}
module.exports = {
csvToJson: csvToJson
}
当我一个接一个地调用这些函数时,第二个函数失败了,因为第一个函数没有完成。
我是否需要将这两个函数调用包装在另一个 Promise 中,即使它们各自都实现了 Promise?
如果我完全误解了这一点,请告知
【问题讨论】:
-
你可以在你的第一个导出函数中
return。这样它就会返回承诺,因此您可以在其上调用另一个then()。 -
第一个函数错误地报告文件已写入,而实际上您所做的只是设置管道。设置管道并不意味着文件被写入;写入过程是异步的。
-
您的
csvToJson函数在else逻辑周围缺少关键的{和},其中一些被误导性缩进,但实际上只有一部分(var data = data.toString();)是附加到else。 -
还建议您决定是否要依赖自动分号插入,然后始终包含(或省略)
;。 (请注意,ASI 是一种纠错机制*,它可能会影响您的决定。或者不会。:-))
标签: javascript promise