$ httpプロミスチェーンが間違った順序で実行されている

dshockey

私はangularjsを初めて使用します。私の目標はとてもシンプルです。データを取得するためにajax呼び出しを行い、完了したら、最初のセットの情報に依存する別のデータセットを取得するために2番目の呼び出しを行いたいと思います。

ネストされたajax呼び出しの代わりにチェーンを利用できるように、また必要に応じて結び付けることができる独立した関数を持つ機能をより適切に保持できるように、promiseメカニズムを利用してこれを実行しようとしています。

私のコードは次のようになります。

var promiseGetWorkTypes = function ($q, $scope, $http) {
	console.log("promiseGetWorkTypes");

	return $q(function (resolve, reject) {
		$http({
			method: 'GET',
			url: '/WorkTypes'
		}).then(
			function (payload) {
				console.log("Got workttypegroups")
				console.log(payload);

				$scope.WorkTypeGroups = payload.data;

				console.log("End of worktypegroups");
				resolve(payload);
			},
			function (payload) {
				reject(payload);
			});
	});
};

var promiseGetRecentActivities = function ($q, $scope, $http) {
	console.log("promiseGetRecentActivities");

	return $q(function (resolve, reject) {
		$http({
			method: 'GET',
			url: '/RecentHistory'
		}).then(
			function (payload) {
				$scope.RecentActivities = payload.data;

				resolve(payload);
			},
			// data contains the response
			// status is the HTTP status
			// headers is the header getter function
			// config is the object that was used to create the HTTP request
			function (payload) {
				reject(payload);
			});
	});
};

var index = angular.module("index", []);

index
.controller('EntitiesController', function ($scope, $http, $timeout, $q) {
	promiseGetWorkTypes($q, $http, $scope)
		.then(promiseGetRecentActivities($q, $http, $scope));
}

ただし、デバッグコンソールを見ると、「promiseGetRecentActivities」の呼び出しが、「promiseGetWorkTypes」のAjax処理が発生する前に開始されていることがわかります。

私はここで何が欠けているか、間違っているのですか?

ミハル・チャレムザ

あなたが書くとき

promiseGetWorkTypes($q, $http, $scope).then(promiseGetRecentActivities($q, $http, $scope));

これpromiseGetActivitesは、この行が評価されるときに呼び出されます。呼び出しをpromiseGetActivities別の関数でラップして、最初のpromiseが解決されて呼び出しが順番に実行されるまで、呼び出しを遅らせることができるはずです

promiseGetWorkTypes($q, $http, $scope).then(function() {
  promiseGetRecentActivities($q, $http, $scope);
});

その理由はthen内部で何が起こっているかとは関係ありませんが、Javascript構文によるものです。以下:

myFunc1(myFunc2());

myFunc1に渡す結果、呼び出しのmyFunc2()いないの参照myFunc2機能を。したがって、論理的にmyFunc2、の前に実行する必要がありますmyFunc1あなたが書いた場合

myFunc1(myFunc2);

次にmyFunc1、への参照を受け取るmyFunc2ので、myFunc1前に実行されますmyFunc2(実際、それを呼び出すコードがmyFunc2内部のどこかにmyFunc1ある場合にのみ実行されます)。

関数をインライン/匿名で定義しても、この動作は変わりません。匿名関数の結果を別の関数に渡すには、次のようにします。

myFunc1((function() {
  return 'something';
})());

匿名関数を最初に評価し、その戻り値として'something'に渡されmyFunc1ます。匿名関数への参照を渡すには、次のようにします。

myFunc1(function() {
  return 'something';
});

そして、myFunc1渡された関数を呼び出すかどうかによって決まります。

それをあなたの質問、あなたのコードに戻してください:

promiseGetWorkTypes($q, $http, $scope).then(promiseGetRecentActivities($q, $http, $scope));

はの結果をpromiseGetRecentActivities($q, $http, $scope)渡すthenので、実行する前に実行する必要があります。thenしたがって、promisepromiseGetWorkTypesが解決されるのを確実に待ちませんあなたが望んでいるように見えるのは、呼び出されたときに実行される関数を渡すことpromiseGetRecentActivities($q, $http, $scope)です。

promiseGetWorkTypes($q, $http, $scope).then(function() {
  promiseGetRecentActivities($q, $http, $scope);
});

します。

ちなみに$q$httpさまざまな機能に渡すなど、少し変わった/複雑すぎるように見えますが、おそらくこの質問の範囲を超えて代替案を検討すると思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javascriptプロミスチェーンが順不同で実行されている

分類Dev

TimerTask.run()でのコマンド実行の順序が間違っている(Javaで記述されたAndroidアプリの場合)

分類Dev

forループが間違った順序で印刷されています

分類Dev

P5.js draw()関数が間違った順序でForループを実行している

分類Dev

Laravelミドルウェアが誤った順序で実行されている

分類Dev

ng-click関数が間違った順序で実行される

分類Dev

C-リンクリストが間違った順序で印刷されている

分類Dev

プロミスチェーン:親プロミスは子プロミスが実行されるまで待機していません

分類Dev

テクスチャが間違った順序で表示される

分類Dev

「間違った」順序で実行されたネストされた Promise

分類Dev

間違った順序で表示されている投稿

分類Dev

グループ内で順序が間違っている行を削除する

分類Dev

Javascript文字列が間違った順序で連結されている

分類Dev

XSL / XML:要素が間違った順序で配置されている

分類Dev

Qプロミスライブラリを使用してプロミスチェーンが順番に実行されない

分類Dev

これらのprint()呼び出しが間違った順序で実行されているように見えるのはなぜですか?

分類Dev

同じマシンでコンパイルされたプログラムを実行すると、GLIBCXXのバージョンが間違っている

分類Dev

Sleep()は「間違った」順序で実行されました。

分類Dev

コンソール出力が間違った順序で表示される

分類Dev

Azure BLOBストレージ-GetBlock Listは、コミットされていないブロックを間違った順序で返します

分類Dev

間違ったPythonバージョンで実行されているMLエンジンバッチ予測

分類Dev

ソートされたファイルをMacOS Xで印刷する(順序が間違っている)

分類Dev

node.jsとasync.jsの使用:シリーズが間違った順序で実行されていますか?

分類Dev

テンプレートパラメータが間違った順序で配置されています。それが正しいか?

分類Dev

Cプログラミングでsleep(int)コードが正しい順序で実行されない

分類Dev

orderby関数を指定した後でもFlutterFirestoreが間違った順序でフェッチしている

分類Dev

Promiseチェーンが原因で、FirebaseFirestoreの更新クエリが実行されません。私は何が間違っているのですか?

分類Dev

オブジェクトデータがc ++コンストラクターで間違った順序で初期化されている場合、どのようなバグが発生する可能性がありますか

分類Dev

Logrotate が間違った時間/時間で実行されている

Related 関連記事

  1. 1

    Javascriptプロミスチェーンが順不同で実行されている

  2. 2

    TimerTask.run()でのコマンド実行の順序が間違っている(Javaで記述されたAndroidアプリの場合)

  3. 3

    forループが間違った順序で印刷されています

  4. 4

    P5.js draw()関数が間違った順序でForループを実行している

  5. 5

    Laravelミドルウェアが誤った順序で実行されている

  6. 6

    ng-click関数が間違った順序で実行される

  7. 7

    C-リンクリストが間違った順序で印刷されている

  8. 8

    プロミスチェーン:親プロミスは子プロミスが実行されるまで待機していません

  9. 9

    テクスチャが間違った順序で表示される

  10. 10

    「間違った」順序で実行されたネストされた Promise

  11. 11

    間違った順序で表示されている投稿

  12. 12

    グループ内で順序が間違っている行を削除する

  13. 13

    Javascript文字列が間違った順序で連結されている

  14. 14

    XSL / XML:要素が間違った順序で配置されている

  15. 15

    Qプロミスライブラリを使用してプロミスチェーンが順番に実行されない

  16. 16

    これらのprint()呼び出しが間違った順序で実行されているように見えるのはなぜですか?

  17. 17

    同じマシンでコンパイルされたプログラムを実行すると、GLIBCXXのバージョンが間違っている

  18. 18

    Sleep()は「間違った」順序で実行されました。

  19. 19

    コンソール出力が間違った順序で表示される

  20. 20

    Azure BLOBストレージ-GetBlock Listは、コミットされていないブロックを間違った順序で返します

  21. 21

    間違ったPythonバージョンで実行されているMLエンジンバッチ予測

  22. 22

    ソートされたファイルをMacOS Xで印刷する(順序が間違っている)

  23. 23

    node.jsとasync.jsの使用:シリーズが間違った順序で実行されていますか?

  24. 24

    テンプレートパラメータが間違った順序で配置されています。それが正しいか?

  25. 25

    Cプログラミングでsleep(int)コードが正しい順序で実行されない

  26. 26

    orderby関数を指定した後でもFlutterFirestoreが間違った順序でフェッチしている

  27. 27

    Promiseチェーンが原因で、FirebaseFirestoreの更新クエリが実行されません。私は何が間違っているのですか?

  28. 28

    オブジェクトデータがc ++コンストラクターで間違った順序で初期化されている場合、どのようなバグが発生する可能性がありますか

  29. 29

    Logrotate が間違った時間/時間で実行されている

ホットタグ

アーカイブ