处理承诺

时间:2017-11-17 12:46:29

标签: javascript promise

我想问一个关于我使用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

我显然在这里误解了一些东西。

3 个答案:

答案 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)})