私のコントローラ上で同時に機能を実行すると、いくつかの非同期エラーが発生します。各コントローラはいくつかのデータを取り、テストのためにサービス内のメソッドを呼び出します。サービスはコントローラに約束を返し、渡されたデータを操作して約束を解決します。サービスのためのコードのアウトラインので、次のようになります。1つのサービスを持つAngularJS複数のコントローラ:非同期エラー
<!-- language: lang-js -->
//Service that our controller can access
app.service("testing", function($timeout, $q) {
//Test function which takes a group, and returns a promise with the result
this.Test = function(resultsLocation, testList, testFunction) {
//promise we are returning
var deferred = $q.defer();
var i = 0;
//TestCallback loop
TestCallBack = function(testList) {
if (i < testList.length) {
//perform a test on one item of the list
testFunction(testList[i]).then(function() {
//push result back to controller
resultsLocation.push(testList[i].result);
i++;
//show result of that one item with scope update.
//also looks visually pleasing to see test come in
//one at a time
$timeout(function() {
TestCallBack(testList);
}, 100);
});
} else {
//we are done. Resolve promise
deferred.resolve("Done");
}
};
//initiate loop
TestCallBack(testList);
//return promise
return deferred.promise;
};
});//testing Service
そして私は、おおよそ次のようになり、いくつかのコントローラを持っている:
<!-- language: lang-js -->
//Peripheral
app.controller("peripheral#", function($scope, testing) {
//self stuff
$scope.Title = "Peripheral#";
$scope.Summary = "";
$scope.Results = new Array();
//initial lin tests
var DiagnosticsList = [
//test1
//test2
//etc...
];
//Tests routine
$scope.Testing = function() {
//reset results
$scope.Results = new Array();
$scope.Summary = "Testing...";
//Do Tests
testing.Test($scope.Results, DiagnosticsList, CustomTestingFunction1).then(
function(result) {
$scope.Summary = "Testing...";
},
function(error) {
console.log("Error testing Peripheral1");
}
);
};
});
「テストは、」HTMLでボタンを押した上で呼ばれています。問題は、controller1が "Testing"を呼び出し、次にcontroller2が "Testing"を呼び出す場合、コントローラ1では約束が決して解決されないということです。さらに悪いことに、いくつかのテスト結果がコントローラ2の結果にプッシュされます。
おそらく私は何かが不足しているかもしれませんが、コントローラが持っているときにサービスがそれ自身のインスタンスになると私はどこかで読んでいます。
とにかく、ここでの動作を実証plunkerです:https://plnkr.co/edit/fE5OD35LaXHWrhv0ohq2?p=preview
は、「テスト」は、個別に細かいですが、他のコントローラがテストしている間、あなたは「テスト」を押すと、あなたがそのようなものの値として異常な動作を取得します押します最初のコントローラはテストを終了しません。
あなたには再入国の問題があります。最初の呼び出しが解決される前に、あなたのサービスの 'Test'メソッドをもう一度呼び出すと、あなたはそれへの参照を失ってしまいました。 Angularのサービスはシングルトンだと思います。 –
それはそれを説明します。私はサービスがシングルトンではないどこかを読んだことを誓っていました。工場シングルトンも同様ですか?完了するまでシングルトンの実行をブロックする方法はありますか?あるいは、それが非シングルトンであるかのようにサービスを動作させますか?申し訳ありませんが、私はかなり新しく角張っており、約束のアイデアはすべて一緒になっています。 – Sonic1015