質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

1回答

1833閲覧

複数の$httpの処理の際、どれかの$http処理が失敗しているときは他の$http処理も全て失敗させたい

xxx_aoi

総合スコア38

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2017/01/11 16:15

$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つの非同期通信も行われないようにできるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リクエストを送信せずにステータスを確認るすことはできません。
js側で同期処理を起こしたとしても、1つ目の処理が成功した時点でリクエストはすでに送られるのでキャンセルはできません。

なので、依存関係にある複数のリクエストを一つにまとめて、一回のリクエストで、PHPの中で確認しましょう。

投稿2017/01/12 00:40

Everatch

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxx_aoi

2017/01/14 03:45

回答ありがとうございます。そして返信が遅れて申し訳ございませんでした。 そういうことなんですね。ためになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問