Javascript 当另一个函数完成时,如何运行该函数?
我有一个角函数:Javascript 当另一个函数完成时,如何运行该函数?,javascript,angularjs,Javascript,Angularjs,我有一个角函数: $scope.addMovie = function(movie){ addMovieRecord(movie) addMovieCredits(movie) } 和两个Javascript函数: var addMovieRecord = function (movie){ createMovie.create({ id: $scope.movieListID.id, release_date: releaseNL.r
$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
})
}
及
因此,当我运行$scope.addMovie
函数时,它应该首先启动创建电影记录的addMovieRecord
函数。然后,createMovie
应该触发addMovieCredits
来加载所有记录
但事实并非如此addMovieCredits
返回所有记录,但刚刚创建的记录除外。看来顺序不对
如果我在create函数之后直接启动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);
}
};
}]);
考虑到createMovie
是一个$resource
对象,您可以这样做:
(我不确定的是,createMovie
是一个$scope
函数,而且您正在createMovie
上调用create
?应该存在一些命名冲突)
然后,使用返回的承诺
$scope.addMovie = function(movie) {
// or try "success" instead of "then" (may vary based on your Angular's version)
addMovieRecord(movie).then(function() {
addMovieCredits(movie)
});
}
更新
语法.then(loadMovies(movie))除了有问题外,问题中的code>也应该有效。then
函数需要一个函数,但在使用loadMovie
语法中的()
立即调用函数后,您正在传递该函数。试试这个
$scope.createMovie = function(movie){
addMovie(movie).$promise.then(function(){
loadMovies(movie)
});
};
在控制器的BIGNING中调用此服务一次
在你每次点击按钮添加一部电影之后,谁可以调用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);
}
$scope.addMovie=函数(moviesCheck){
var电影={
id:$scope.movieListID.id,
发布日期:releaseNL.release\u日期,
imdb_评级:$scope.movieImdbRating.imdbRating,
标题:$scope.movieListID.original_标题,
图片:$scope.movieListID.poster_路径,
电影id:$scope.movieListID.id,
背景:$scope.movieListID.background\u路径,
概述:$scope.movieCredits.overview
}
movieService.AddMovie(电影);
//您可以调用在数据库中添加电影的服务
然后将电影添加到视图中的现有列表中
moviesCheck.push(电影);
}
在createMovie.create
完成之前,您正在调用loadMovies(movie)
函数。您应该传递一个引用或一个匿名函数,该函数执行loadMovies(movie)
。只要我理解您的代码,您就可以编写>)。然后(loadMovies)代码>@styopdev你是说在createMovie.create调用之后?这不正是我在示例中所拥有的吗?@PeterBoomsma})。然后(loadMovies)
和})。然后(function(){loadMovies(movie)})
第一个代码传递函数作为参数,第二个(示例中的代码)将立即调用。感谢您的建议。我必须承认,我确实为这个问题编辑了一些命名,所以它不是我实际代码的100%副本,但我将研究它。我将尝试在我的项目中使用您的建议。我尝试使用代码,但它不断返回一个错误无法读取未定义的属性“then”
。它指向addMovieRecord(movie)。然后(function()
好的,您可以发布createMovie.create的内容吗({
在您的代码中返回?我编辑了我的问题以更好地表示命名。我还向问题添加了createMovie
服务功能。当然,我修改了答案。我假设您使用的是$resource
,但您使用的是$http
。因此更新的解决方案应该可以工作。
$scope.createMovie = function(movie){
addMovie(movie).$promise.then(function(){
loadMovies(movie)
});
};
movieService.loadMovies().then(function(response) {
$scope.moviesCheck = response.data;}
<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);
}