$q.allを使用して複数の$httpのpost処理が全て正常に動作すると判断されてから$httpのリクエスト送信(mysqlにフォームに入力した情報を追加する)させ、どちらかの$httpのpost処理が失敗している場合はもう片方の$httpのpost処理が成功していても行われないようにしたいのですが、うまくできません。
index.html <!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="UTF-8" /> <title>AngularJS</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script> <script src="http.js"></script> </head> <body ng-controller="MyController"> <form name="myForm" ng-submit="onsubmit()" novalidate> <label for="name">name:</label><br /> <input id="name" name="name" type="text" ng-model="name" ><br /> <label for="name">age:</label><br /> <input id="age" name="age" type="text" ng-model="age" ><br /> <label for="name">com:</label><br /> <input id="acom" name="com" type="text" ng-model="comment" ><br /> <input type="submit" value="申込" ng-disabled="myForm.$invalid" ng-click="onclick()"/> </form> </body> </html>
http.js angular.module('myApp', []) .controller('MyController', ['$scope','$http', '$q',function($scope, $http, $q) { $scope.onclick = function(name,age,comment) { var first = $http({ method: 'POST', url: 'post.php', data: { name: $scope.name, age: $scope.age, comment:$scope.comment } }); var second = $http({ method: 'POST', url: 'post.php', data: { name: $scope.name, age: $scope.age, comment:$scope.comment } }); $q.all([ first, second ]); }; }]);
post.php <?php $dsn = 'mysql:dbname=*****;host=*****'; $user = '*****'; $pass = '*****'; $pdo = new PDO($dsn, $user, $pass); switch ($_SERVER['REQUEST_METHOD']) { case 'POST': $in = json_decode(file_get_contents('php://input'), true); $st = $pdo->prepare("INSERT INTO data(name,age,comment) VALUES(:name,:age,:comment)"); $st->execute($in); break; }
これだと$q.allの処理を待たずしてリクエスト送信され、データベースに登録されてしまいます(片方にエラーがあった場合でももう片方は登録されている)。
最初に$httpを使わずに変数だけ定義しておいて
$q.all([ first, second ]) .then( function(){ return $http(first); });
という感じで$q.allメソッド後に$httpを使う方法も試しましたが、こうすると$q.allでエラーの確認ができず、片方にエラーがあってももう一方はリクエスト送信できてしまいます。
どうすれば1つの非同期通信が失敗だった場合もう1つの非同期通信も行われないようにできるのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/14 03:45