2016-08-15 6 views
0

で約束を終えた後に応答しませんは.then私は別のコントローラにイベントをブロードキャストするコントローラを持っている角度

$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; 

そして最後に、私は、だから、すべての関連するコードのdelete

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(); 
}); 

に応答routesファイルを持っています。今問題です。最初のコントローラで$scope.removeMovie関数を呼び出すと、クリックされたレコードがデータベースから削除され、ファクトリにはsuccess factoryログがコンソールに表示されます。私は成功し、工場機能の後.thenコールバックに入ることができないのはなぜしかし、私は

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

第二のコントローラから.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機能が正常に動作するはずです。

私は、工場での成功コールバックの内側 deferred.resolve()実行が行方不明だと思う
+0

私はこれをどのように逃しましたか?ありがとう。 –

+0

問題ありません...そしてそれはどういうことかよく分かっています...時々、コーディング中にこのようなものに盲目的になることがあります:P – thepio

+0

そう、私はちょうどコーヒーをつかんでいるべきです。しかし、それを指摘してくれてありがとう。私は理由のために正しい答えのための最も低い担当者を選択することに決めました:)。 –

1

deferred.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); 
     }) 
     .catch(function(response) { 
      deferred.reject(response); 
     }); 
    return deferred.promise; 
}; 

return factory; 

をあなたがまたしてキャッチ()メソッドを処理する必要があります

+0

そんなばかげたミス。それを指摘してくれてありがとう。 –

+0

ようこそ。) –

0

これは、約束を解決または拒否していないために発生します。あなたが他の処理を行っていない場合は、直接$httpサービスによって返された約束を返すことができ、あなたの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; 

を更新します。

var factory = {} 

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

return factory; 
関連する問題