2016-01-13 3 views
1

Я использую несколько внешних баз данных, чтобы получить данные, необходимые для создания записи, которую я хочу в моей базе данных. У меня есть приложение, в котором пользователи могут искать и добавлять фильм в свой список наблюдения.Как связать несколько вызовов http в Angular

Для этого мне нужны следующие данные,

  1. Данные фильмы, такие как название, дата выпуска, и ид.
  2. Оценка imdb.
  3. Кинофильмы, такие как актеры и режиссеры.

Это, как я делаю это сейчас,

movieAdd.add(movie.id).then(function(response){ 
    $scope.movieListID = response; 

    movieAdd.imdbRating($scope.movieListID.imdb_id).then(function(response){ 
    $scope.movieImdbRating = response; 

    movieAdd.crew(movie.id).then(function(response){ 
     $scope.movieCredits = response 

     return createMovie.create({ 
     id:    $scope.movieListID.id, 
     imdb_rating: $scope.movieImdbRating.imdbRating, 
     title:   $scope.movieListID.original_title, 
     image:   $scope.movieListID.poster_path, 
     movie_id:  $scope.movieListID.id, 
     backdrop:  $scope.movieListID.backdrop_path, 
     overview:  $scope.movieCredits.overview 
     }) 

    }) 
    }) 
}) 

я называю обслуживание, возврат магазину ответ в объеме, так что я могу использовать его в дальнейшем, и так далее.

Это правильный способ сделать это, или есть лучший способ?

+0

Технически ничего плохого в подходах нет, но я бы предложил вам сгладить цепи обещаний - http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/ UPDATE: ответ Martijn Welkers - хороший пример , – tiblu

ответ

2

When chaining promises you can just return a promise instead of nesting them так:

movieAdd.add(movie.id).then(function(response){ 
    $scope.movieListID = response; 
    return movieAdd.imdbRating($scope.movieListID.imdb_id); 
}).then(function(response){ 
    $scope.movieImdbRating = response; 
    return movieAdd.crew(movie.id) 
}).then(function(response){ 
    $scope.movieCredits = response 

    return createMovie.create({ 
    id:    $scope.movieListID.id, 
    imdb_rating: $scope.movieImdbRating.imdbRating, 
    title:   $scope.movieListID.original_title, 
    image:   $scope.movieListID.poster_path, 
    movie_id:  $scope.movieListID.id, 
    backdrop:  $scope.movieListID.backdrop_path, 
    overview:  $scope.movieCredits.overview 
    }); 
}) 

это помогает держать ваш код сглаживаются и чистый

+0

Благодарим вас за ссылку, дайте отличную информацию. –

0

Это зависит от того, как вы хотите использовать эту информацию. Если вы собираетесь использовать его только в этом scope, используйте это, чтобы сделать это просто.

Как правило, по привычке я хотел бы хранить запрошенную информацию, используя LocalStorage как JSON и получить к ней доступ оттуда.

Это зависит от сценария однако ..

0

использование попытка

$ q.all

для посыла цепи

взгляд на примере ниже:

> http://jsfiddle.net/ThomasBurleson/QqKuk/ 
+0

Если вы используете тайм-аут в угловом формате, вам не нужно обертывать его в $ apply –

+0

@MartijnWelker, чтобы быть справедливым: '// Так используйте $ timeOut() или $ apply()' –

+0

@PeterBoomsma. Если вы используете $ apply вы можете столкнуться с ошибкой '$ digest is is progress progress', поэтому лучше использовать $ timeout –

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