2015-06-15 21 views
0

我想在使用ES6的JavaScript中使用Promises從對象返回2個方法中的數據,這會在生產中調用到端點。如何正確使用承諾返回2個不同的結果

我的MovieApi對象我有2個承諾,我想首先返回一個電影列表,然後通過ID返回1個電影。我想用promise來避免回調地獄。我下面列出的問題的答案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對象,本質上具有相同的可讀性問題,因爲如果我使用回調。

+0

[這是一個非常良好的閱讀](http://pouchdb.com/2015 /05/18/we-have-a-problem-with-promises.html)如果你想更好地理解Promise。 –

+0

你一定想用'MovieApi.findMovie(...)' – Bergi

+0

呃...我現在可以看到這個錯誤,但這是使用承諾時遇到的一個問題,現在我得到了Arun的幫助,下面是Arun 。感謝您鏈接到類似的問題,這是同樣的問題。 –

回答

1

問題是return findMovie(req.params.id),你findMovieMovieApi對象的屬性,以便

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

演示:Fiddle

+0

謝謝你,所以我只是想念MovieApi對象。我想知道在這種情況下最好的方法是設置需要電影和電影的MovieStore對象。我應該在調用promise之前設置MovieStore對象,並首先將影片添加到它,然後將影片添加到它? –