2015-06-15 4 views
0

Я пытаюсь использовать Promises в JavaScript с помощью ES6, чтобы возвращать данные из 2 методов из объекта, которые в процессе производства вызывают конечную точку.Как правильно использовать обещания вернуть 2 разных результата

Мой объект MovieApi У меня есть 2 обещания, которые я хочу вернуть, во-первых, список фильмов, а затем 1 фильм по id. Я хочу использовать обещания, чтобы избежать адского черта. Я выполняю подход, указанный в качестве ответа на вопрос 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), если вы хотите лучше понять обещания. –

+0

Вы, конечно же, хотели использовать 'MovieApi.findMovie (...)' – Bergi

+0

Ну ... Я вижу эту ошибку сейчас, но это была проблема, с которой я сталкивался с обещаниями, и теперь мне это помогло, Аруном ниже , Спасибо, что ссылались на этот похожий вопрос, это была та же проблема. –

ответ

1

Проблема заключается в том return findMovie(req.params.id), ваш findMovie является собственностью MovieApi объекта так

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

Демо: Fiddle

+0

Спасибо за это, поэтому я просто пропустил объект MovieApi. Мне интересно, какой лучший подход в этом случае для настройки моего объекта MovieStore, который нуждается в фильмах и фильмах. Должен ли я просто установить свой объект MovieStore перед тем, как будет вызываться обещание, и сначала добавить к нему фильмы, а затем фильм? –

Смежные вопросы