我想问一个关于我使用Promise的方式的问题,因为我不确定我是否有过复杂的事情。
首先,我试图创建一些我希望一个接一个地执行的方法,因为依赖于每个先前方法的结果。
我的项目结构是这样的
my_project
csv
helpers
FileDownload.js
scripts
getCSVData.js
app.js
目前每个文件都是
## FileDownload.js
const fetch = require('node-fetch');
const fs = require('fs');
module.exports = function(url, target) {
return fetch(url)
.then(function(res) {
return new Promise((resolve, reject) => {
var dest = fs.createWriteStream(target);
res.body.pipe(dest)
.on('finish', () => resolve()) // ** Resolve on success
.on('error', reject); // ** Reject on error
});
}).then(result => {
console.log(`File saved at ${target}`)
return result;
});
}
## getCSVData.js
const file_download = require('../helpers/FileDownload')
function getPremierLeagueData() {
file_download("http://www.football-data.co.uk/mmz4281/1718/E0.csv", "./csv/premier_league/premier_league.csv")
}
module.exports = {
getPremierLeagueData: getPremierLeagueData
}
## app.js
const premier_league = require('./scripts/getCSVData')
premier_league.getPremierLeagueData()
.then(function(result){ console.log(result)})
运行node app.js
时,我收到错误TypeError: Cannot read property 'then' of undefined
如果我回到我的FileDownload
函数和未定义的console.log(result)
。
我的困惑在于,因为resolve()
被称为我认为承诺得到了解决?所以这应该贯穿.then
。
我显然在这里误解了一些东西。
答案 0 :(得分:3)
您的getPremierLeagueData
函数未返回Promise。它没有返回任何东西......
您只需要返回file_download
的结果,该结果已经是Promise:
function getPremierLeagueData() {
return file_download(args)
}
答案 1 :(得分:1)
需要从getPremierLeagueData
function getPremierLeagueData() {
return file_download("http://www.football-data.co.uk/mmz4281/1718/E0.csv", "./csv/premier_league/premier_league.csv")
}
OR(使用新的ES6语法)
const getPremierLeagueData = () => file_download("http://www.football-data.co.uk/mmz4281/1718/E0.csv", "./csv/premier_league/premier_league.csv")
注意:
你也可以减少这个
module.exports = {
getPremierLeagueData: getPremierLeagueData
}
与
module.exports = { getPremierLeagueData }
答案 2 :(得分:1)
我在您的文件中做了一些小改动。您既没有在FileDownload中解析任何内容,也没有在getCSVData中返回任何内容。因此,最终控制台将不打印任何内容。请尝试下面的代码
## FileDownload.js
const fetch = require('node-fetch');
const fs = require('fs');
module.exports = function(url, target) {
return new Promise(function(resolve,reject){
fetch(url)
.then(function(res) {
var dest = fs.createWriteStream(target);
res.body.pipe(dest)
.on('finish', function(data){
console.log(`File saved at ${target}`)
resolve(data)
})
.on('error', function(){
reject();
}) // ** Reject on error
})
})
}
## getCSVData.js
const file_download = require('../helpers/FileDownload')
function getPremierLeagueData() {
return file_download("http://www.football-data.co.uk/mmz4281/1718/E0.csv", "./csv/premier_league/premier_league.csv")
}
module.exports = {
getPremierLeagueData: getPremierLeagueData
}
## app.js
const premier_league = require('./scripts/getCSVData')
premier_league.getPremierLeagueData()
.then(function(result){ console.log(result)})