如何正确使用promises返回2个不同的结果

时间:2015-06-15 03:51:44

标签: javascript promise ecmascript-6 es6-promise

我正在尝试在JavaScript中使用Promise,使用ES6从一个对象返回2个方法的数据,这将在生产中调用到端点。

我的MovieApi对象我有2个承诺,我想首先返回一个电影列表,然后是1个电影。我想用promises来避免回调地狱。我遵循列出的问题Arent promises just callbacks的答案,但我显然做错了,因为我有错误findMovie is not defined

let movieData = [ 
    {
      id: '1011',
      name: 'Gleaming the cube', 
      year: "1989"
    },
    {
      id: "1012",
      name: "Airborne", 
      year: "1989"
    }
  ]

let MovieApi = {    
  findMovie: function(id) {    
    return new Promise(function(resolve, reject) {
      if(id === undefined) reject(Error('incorrect movie id'));

      let movie = ''
      for (let m of movieData) {
        if (m.id.toLowerCase() === id.toLowerCase()) {
          movie = m
          break
        }
      }
      resolve(movie)
    });
  },
  findAllMovies: function() {
    return new Promise(function(resolve, reject) {    
      if(movieData === undefined) reject(Error('Could not find any movies'))

      resolve(movieData)
    });
  }    
}

像这样调用电影承诺......但是在尝试调用我的第二个.then()方法时出错了

MovieApi.findAllMovies()
.then( function (movies){
  return findMovie(req.params.id)
}).then(function(movie){
  let MovieStore = { movie: movie, movies: movies }
}).catch(function(error) {
  console.error("Failed!", error);
});

有没有办法摆脱回调地狱,或者我只需要再次调用MovieApi对象,基本上具有相同的可读性问题,就像我使用回调一样。

1 个答案:

答案 0 :(得分:1)

问题是return findMovie(req.params.id),您的findMovieMovieApi对象的属性,所以

MovieApi.findAllMovies()
.then( function (movies){
  return MovieApi.findMovie(req.params.id)
})

演示:Fiddle