2016-09-15 14 views
1

この問題があります。私はかなり新しく、フォームを管理するディレクティブを変更して、送信ボタンを無効にしてからすべての作業が完了したときに再び有効にするよう指示しました。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()関数が複数の非同期呼び出しを呼び出していた場合、これは機能しませんでした。

+0

まず、ngSubmitFunctionは何を返しますか...その非同期関数で約束を返していないか、あるいはコールバックパターンを使用しています(入力としてコールバック関数を提供しています)。かなり運が良かった。 ---あなたの約束を前に返すようにしてください。それで... – Jens

+0

あなたの意見は私を思い浮かべました。すべての子関数はそれに戻りませんでした。最終的にtheresは常に約束するので、すべての関数がうまくいっていました。この問題は、3.5Mコードラインプロジェクトのすべてのコントローラを変更し、開発者が作成したすべての機能に対して常にリターンステートメントを持つことを信頼することです。チャンスではありません。ウォッチャーなどで、ngSubmitFunction()の "フード"の下で呼び出される約束を "検出"する別の方法はありますか? – p4x

+0

短い答え:いいえ、私は確かに呼び出しスタックを約束して動作する関数のこの動作を強制することをお勧めします。それは単なる良い実践と常識のIMOです。 (明らかに角の場合がありますが、それらを残すことができます)。たとえすべての約束が同じ枠組みであっても、あなたが現在約束している約束を伝えてくれる何かをハッキングしたとしても、待つべきかを知ることは不可能であり、すべて待っていると言えるかもしれませんが、無限ロックなど。 – Jens

答えて

0

あなたが約束を使用している場合は、あなたの非同期機能は、彼らがしなければ、それはこのように動作するはずです、約束を返す必要があります:

var ngSubmit = function() { 
    vm.disabled = true; 
    $scope.ngSubmitFunction().then(() => { 
     vm.disabled = false; 
    }); 
} 
0

私はその後ngSubmitFunction()

の下に何があるか分かりませんあなたは運がない、約束はここであなたを助けません。約束または$q.whenは、魔法のように呼び出しを検査して、それが開始した非同期なものを見たり、それらを待ったりすることはできません。ngSubmitFunction()は、その非同期結果自体の約束を返す必要があります。

あなたはawaitable約束を返すする必要が何かを非同期に行います(おそらく)あなたのコードベースですべての機能を作成する必要があります。これを回避する方法はありません。

0

誰かが不思議に思うような場合には、私たちはその解決策を見つけられませんでした。そこで、すべての関数チェーンに戻り値を追加して、ngSubmitFunctionが約束を受け取り、そのためにそれが終了するのを待つことができるようにします。これは、約束が暗示されている場合だけでなく、良いプログラミングの練習でもあります。

複数の約束があるケースは稀ですので、コントローラ自体で個別に扱います。

ご意見ありがとうございます。

関連する問題