この問題があります。私はかなり新しく、フォームを管理するディレクティブを変更して、送信ボタンを無効にしてからすべての作業が完了したときに再び有効にするよう指示しました。AngularJS - "Chaining promises"の間の他の関数
通常、呼び出される関数には非同期呼び出しがあるため、コードを順番に追加するだけでは機能しません。
var ngSubmit = function() {
vm.disabled = true;
$scope.ngSubmitFunction();
vm.disabled = false;
}
ボタンは、ngSubmitFunction()で非同期呼び出しが完了する前に有効になります。
だから私は約束はそれを修正するだろうと思ったとのようなものを作った:これは出力エラーをしませんが(.thenが呼び出されることはありません)もう一度ボタンを有効にしたことがない
var promise = function() {
return $q(function (resolve) {$scope.ngSubmitFunction()});
}
var ngSubmit = function() {
vm.disabled = true;
promise().then(function() {
vm.disabled = false;
});
}
。
$scope.submitPromise = function() {
return $q.when($scope.ngSubmitFunction());
}
この機能を.then呼び出しんが、再び、仕上げに任意の子非同期機能を待ちません。
は、すべて同じ結果で、この1を除いて、約束宣言の異なる種類を試してみました。 '.then'はシーケンシャルバージョンのように即座に呼び出されます。
ngSubmitFunction()の下に何があるのか分かりません。これは数十の開発者によって使用され、0から複数の非同期呼び出しを含むことがあります。 )
ngSubmitFunction(FUNC()
呼び出す - FUNC()は、(作成呼び出すために天気をを決定する)またはupdate()
- - アップデートを(:しかし、典型的なシナリオは次のようなものです終了時)と呼ばれている - )(次いで、(関数が(elementFactory.update() - - 非同期呼び出し
である))elementFactory.update呼び出します。
- - - この時点で、もう一度ボタンを有効にする必要があります。
私はこれをどのように達成することができますか?その間に約束されていない機能を約束する方法がありますか?他のすべてのことが行われたときにのみコードを実行させる別の方法はありますか?私は、非同期呼び出しが終了したときにDataFactoryでイベントを作成することを考えましたが、update()関数が複数の非同期呼び出しを呼び出していた場合、これは機能しませんでした。
まず、ngSubmitFunctionは何を返しますか...その非同期関数で約束を返していないか、あるいはコールバックパターンを使用しています(入力としてコールバック関数を提供しています)。かなり運が良かった。 ---あなたの約束を前に返すようにしてください。それで... – Jens
あなたの意見は私を思い浮かべました。すべての子関数はそれに戻りませんでした。最終的にtheresは常に約束するので、すべての関数がうまくいっていました。この問題は、3.5Mコードラインプロジェクトのすべてのコントローラを変更し、開発者が作成したすべての機能に対して常にリターンステートメントを持つことを信頼することです。チャンスではありません。ウォッチャーなどで、ngSubmitFunction()の "フード"の下で呼び出される約束を "検出"する別の方法はありますか? – p4x
短い答え:いいえ、私は確かに呼び出しスタックを約束して動作する関数のこの動作を強制することをお勧めします。それは単なる良い実践と常識のIMOです。 (明らかに角の場合がありますが、それらを残すことができます)。たとえすべての約束が同じ枠組みであっても、あなたが現在約束している約束を伝えてくれる何かをハッキングしたとしても、待つべきかを知ることは不可能であり、すべて待っていると言えるかもしれませんが、無限ロックなど。 – Jens