2016-01-12 3 views
1

У меня есть угловая функция:Как запустить функцию, когда другая функция завершена?

$scope.addMovie = function(movie){ 
    addMovieRecord(movie) 
    addMovieCredits(movie) 
} 

И два Javascript функции:

var addMovieRecord = function (movie){ 

    createMovie.create({ 
    id:    $scope.movieListID.id, 
    release_date: releaseNL.release_date, 
    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 
    }) 

} 

И

var addMovieCredits = function (movie){ 

    movieService.loadMovies().then(function(response) { 
    $scope.moviesCheck = response.data; 

} 

Так что, когда я запустить функцию $scope.addMovie он должен первым стрелять функцию addMovieRecord которая создает видеозапись. Затем createMovie должен запустить addMovieCredits для загрузки всех записей.

Но этого не происходит. addMovieCredits возвращает все записи, кроме только что созданного. Так это выглядит, как порядок не является правильным,

Если я стрелять addMovieCredits (movie) непосредственно после функции создания он делает загрузить все записи,

createMovie.create({ 
    id:    $scope.movieListID.id, 
    release_date: releaseNL.release_date, 
    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 
}).then(addMovieCredits(movie)); 

Но это не то, что я хочу. Я хочу загрузить записи фильма после завершения функции добавления.

Любые предложения о том, как это сделать?

* обновление *

Это служба createMovie,

app.factory('createMovie', ['$http', function($http){ 
    return{ 
    create: function(movie){ 
     return $http.post('/movies.json', movie); 
    } 
    }; 
}]); 
+0

Вы вызываете функцию 'loadMovies (movie)' перед выполнением 'createMovie.create'. Вы должны передать ссылку или анонимную функцию, которая выполняет 'loadMovies (movie)'. – A1rPun

+0

Насколько я понял ваш код, вы можете написать ''}). Then (loadMovies); '' – styopdev

+0

@styopdev вы имеете в виду после вызова createMovie.create? Разве это не то, что у меня есть в моем примере? –

ответ

2

Учитывая createMovie является $resource объект, то вы можете сделать так:

(То, что я не уверен в вашем коде, что createMovie является функцией $scope, а также вы вызываете create на createMovie? Там должен быть какой-то конфликт имен)

var addMovieRecord = function (movie){ 
    // return from here which should be a promise 
    return createMovie.create({ 
    id:    $scope.movieListID.id, 
    release_date: releaseNL.release_date, 
    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 
    }); 
} 

Затем использовать возвращаемый обещание

$scope.addMovie = function(movie) { 
    // or try "success" instead of "then" (may vary based on your Angular's version) 
    addMovieRecord(movie).then(function() { 
     addMovieCredits(movie) 
    }); 
} 

Update

с синтаксисом .then(loadMovies(movie)); в вашем вопросе также должен работать только есть проблема. Функция then ожидает функцию, но вы передаете функцию после того, как вы сразу вызываете ее, используя () в синтаксисе loadMovie.

+0

Благодарим вас за предложения. Должен признаться, что я редактировал некоторые имена для этого вопроса, поэтому это не 100% копия моего фактического кода, но я собираюсь изучить его. Я попытаюсь использовать ваше предложение в своем проекте. –

+0

Я пытался работать с кодом, но он продолжает возвращать ошибку 'Can not read property 'then' of undefined'. Что указывает на 'addMovieRecord (movie) .then (function()' –

+0

Хорошо, можете ли вы разместить то, что делает 'createMovie.create ({' возвращается в вашем коде? –

1

Попробуйте это.

$scope.createMovie = function(movie){ 
    addMovie(movie).$promise.then(function(){ 
     loadMovies(movie) 
    }); 
}; 
0
movieService.loadMovies().then(function(response) { 
$scope.moviesCheck = response.data;} 

вы называете эту услугу один раз в bigining контроллера и после того, как вы добавите кино каждый раз при нажатии на кнопке, который invoque функции AddMovie проходящего список фильмов.

<button ng-click="AddMovie(moviesCheck)"></button> 


$scope.addMovie = function (moviesCheck){ 

     var movie ={ 
     id:    $scope.movieListID.id, 
     release_date: releaseNL.release_date, 
     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 
     } 

    movieService.AddMovie(Movie) ; 

// you call the service who add the movie at database 
then you add the movie at the existing list in the view 

    moviesCheck.push(Movie); 

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