2016-08-15 52 views
0

整理承諾響應後我有控制器,其中我廣播在不同的控制器的事件:。然後在不角

getmovieController.js:

$scope.removeMovie = function(movie){ 
    $rootScope.$broadcast('onremoveMovieEvent', movie); 
}; 

這是其他控制器在我稱之爲

$scope.$on('onremoveMovieEvent', function (event, movie) { 
    movieFactory.removeMovie(movie).then(function(){ 
     Notification.success(movie.title + ' has been removed from your watchlist') 
    }) 
}); 
:請求的函數工廠內

moviesearchController.js功能210

這是帶有removeMovie功能的工廠。

movieFactory.js

var factory = {} 

factory.removeMovie = function (movie) { 
    var deferred = $q.defer(); 
    $http({ 
     method: 'DELETE', 
     url: '/movies', 
     data: movie, 
     headers: {"Content-Type": "application/json;charset=utf-8"} 
    }) 
     .success(function(){ 
      console.log('success factory'); 
     }) 
     .catch(function(){ 
     }); 
    return deferred.promise; 
}; 

return factory; 

最後我有一個響應刪除

movies.js

router.delete('/', function(req,res){ 

    pool.getConnection(function(err, connection){ 

     connection.query('DELETE FROM movies WHERE id= ?', [req.body.id], function(err, result) { 
      if (err) { 
       throw err; 
      } else { 
       console.log('removed') 
      } 
     }); 
     connection.release(); 
    }); 
    res.status(204).end(); 
}); 

所以這是所有相關的代碼路徑文件。現在的問題。當我在第一個控制器中調用$scope.removeMovie函數時,單擊的記錄將從數據庫中刪除,工廠將在控制檯中顯示success factory日誌。但我不能從第二控制器

$scope.$on('onremoveMovieEvent', function (event, movie) { 
    movieFactory.removeMovie(movie).then(function(){ 
     Notification.success(movie.title + ' has been removed from your watchlist') 
    }) 
}); 

爲什麼我不能進入一個全成工廠函數後.then回調獲取到.then回調?

回答

0

您應該在工廠中包含deferred.resolvedeferred.reject函數。所以基本上你這樣做:

factory.removeMovie = function (movie) { 
    var deferred = $q.defer(); 
    $http({ 
    method: 'DELETE', 
    url: '/movies', 
    data: movie, 
    headers: {"Content-Type": "application/json;charset=utf-8"} 
    }) 
    .success(function(response){ 
    console.log('success factory'); 
    deferred.resolve(response); // Include response if you want 
    }) 
    .catch(function(error){ 
    deferred.reject(error); // Include error if you want 
    }); 

    return deferred.promise; 
}; 

這實際上將承諾成功/失敗,並將返回響應。然後您的控制器中的then功能就可以工作。

+0

啊geez我怎麼錯過了這個。呃謝謝。 –

+0

沒問題......而且你知道它是如何的......有時候你只是在編碼時盲目地看到這樣的東西:P – thepio

+0

是的,我應該只是喝了一些咖啡。感謝您指出它。我決定選擇最低的代表爲正確的答案,原因:)。 –

1

我覺得有缺失deferred.resolve()成功回調內部執行在工廠:

factory.removeMovie = function (movie) { 
    var deferred = $q.defer(); 
    $http({ 
     method: 'DELETE', 
     url: '/movies', 
     data: movie, 
     headers: {"Content-Type": "application/json;charset=utf-8"} 
    }) 
     .success(function(response){ 
      console.log('success factory'); 
      deferred.resolve(response); 
     }) 
     .catch(function(response) { 
      deferred.reject(response); 
     }); 
    return deferred.promise; 
}; 

return factory; 

你也應該處理趕上()法:deferred.reject()

+0

這樣一個愚蠢的錯誤。感謝您指出。 –

+0

不客氣;) –

0

發生這種情況是因爲您沒有解決或拒絕承諾。更新您的movieFactory.js

var factory = {} 

factory.removeMovie = function (movie) { 
    var deferred = $q.defer(); 
    $http({ 
     method: 'DELETE', 
     url: '/movies', 
     data: movie, 
     headers: {"Content-Type": "application/json;charset=utf-8"} 
    }) 
    .success(function(){ 
     console.log('success factory'); 
     deferred.resolve(/* Do send some response if necessary */); 
    }) 
    .catch(function(){ 
     deferred.reject(/* Do send some response if necessary */); 
    }); 
    return deferred.promise; 
}; 

return factory; 

您也可以直接返回承諾通過$http服務,如果你沒有做任何其他處理返回。

var factory = {} 

factory.removeMovie = function (movie) { 
    return $http({ 
     method: 'DELETE', 
     url: '/movies', 
     data: movie, 
     headers: {"Content-Type": "application/json;charset=utf-8"} 
    }); 
}; 

return factory;