[解決済み] Angularjs $q.all
2022-12-04 20:39:45
質問
angularjsで$q.allを実装したのですが、コードがうまく動きません。以下は私のコードです。
UploadService.uploadQuestion = function(questions){
var promises = [];
for(var i = 0 ; i < questions.length ; i++){
var deffered = $q.defer();
var question = questions[i];
$http({
url : 'upload/question',
method: 'POST',
data : question
}).
success(function(data){
deffered.resolve(data);
}).
error(function(error){
deffered.reject();
});
promises.push(deffered.promise);
}
return $q.all(promises);
}
そして、これがサービスを呼び出す私のコントローラです。
uploadService.uploadQuestion(questions).then(function(datas){
//the datas can not be retrieved although the server has responded
},
function(errors){
//errors can not be retrieved also
})
私のサービスでは、$q.allの設定に問題があるようです。
どのように解決するのですか?
javascriptでは
block-level scopes
だけです。
function-level scopes
:
この記事を読む javaScriptのスコープとホイスティング .
あなたのコードをどのようにデバッグしたかを見てください。
var deferred = $q.defer();
deferred.count = i;
console.log(deferred.count); // 0,1,2,3,4,5 --< all deferred objects
// some code
.success(function(data){
console.log(deferred.count); // 5,5,5,5,5,5 --< only the last deferred object
deferred.resolve(data);
})
-
と書くと
var deferred= $q.defer();
と書くと と表示されます。 を関数の先頭に持ってくるということは、javascriptがこの変数を関数スコープ上でfor loop
. - 各ループで、最後の が遅延します。 が前のものを上書きする場合、そのオブジェクトへの参照を保存するブロックレベルのスコープは存在しません。
- 非同期コールバック(成功/エラー)が呼び出されたとき、それらは最後の 遅延オブジェクト を参照し、それだけが解決されるので $q.allは決して解決されません なぜなら、それはまだ他の遅延オブジェクトを待っているからです。
- 必要なのは、反復処理する各項目について無名関数を作成することです。
-
関数はスコープを持つので、遅延オブジェクトへの参照は
closure scope
に保存されます。 -
#dfsq さんのコメントの通りです。http自体がプロミスを返すので、新しいディファードオブジェクトを手動で構築する必要はありません。
ソリューション
angular.forEach
:
デモのプランカーです。 http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
UploadService.uploadQuestion = function(questions){
var promises = [];
angular.forEach(questions , function(question) {
var promise = $http({
url : 'upload/question',
method: 'POST',
data : question
});
promises.push(promise);
});
return $q.all(promises);
}
私の好きな方法は
Array#map
:
デモのプランカーです。 http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
UploadService.uploadQuestion = function(questions){
var promises = questions.map(function(question) {
return $http({
url : 'upload/question',
method: 'POST',
data : question
});
});
return $q.all(promises);
}
関連
-
[解決済み] `ui-router` $stateParams vs. $state.params
-
[解決済み] ディレクティブ '...' が要求するコントローラ 'ngModel' が見つかりません。
-
[解決済み] 誰かangularjsの$qサービスの使用について説明してください。[重複しています]。
-
[解決済み] angularjsで$compileを操作する
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] AngularJS 。非同期データでサービスを初期化する
-
[解決済み] モデルデータや振る舞いをどこに置くか?[tl; dr; サービスを利用する]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] `ui-router` $stateParams vs. $state.params
-
[解決済み] data-ng-file-selectが動作しないのはなぜですか?
-
[解決済み] Apigee API へのリクエストで 401 レスポンスエラーが発生する
-
[解決済み] 新しい/分離されたスコープを求める複数のディレクティブ [ngController, ...] がある。
-
[解決済み] controllerAs "プロパティを使用する理由は何ですか?
-
[解決済み] createspyとcreatespyobjの違いは何ですか?
-
[解決済み] どのように$state.goにパラメータを追加しますか?
-
[解決済み] AngularJSとHandlebars - 両方必要なのかどうか
-
[解決済み] 条件に応じて特定のルートにリダイレクトする機能
-
[解決済み] 子コントローラから親スコープにアクセスするAngularJS