6

Mark Dalgleish は、AngularJS ビューで promise を使用する方法についての素敵な記事を書きました。コメントでこれについて質問する人もいましたが、Mark は (まだ) 答えていません。同じ質問をしているので、代わりに StackOverflow で質問して回答を得ます。

  1. ビューでプロミスを使用する場合、非同期であるため、「読み込み中」/「待機中」の表示をどのように処理すればよいですか? プロミスには「解決済み」または「withinRequest」プロパティのようなものがありますか?

  2. エラーを処理するにはどうすればよいですか? 通常、それらは 2 番目のコールバックで発生しますが、ビューで promise を直接使用する場合、このケースは処理しません。別の方法はありますか?

ありがとうございました。

4

1 に答える 1

13

編集: angular v1.2 の時点で、ビューのプロミスの解決はデフォルトではアクティブ化されていません

ビュー内の promise の自動解決は、最初は便利なツールのように見えますが、理解して慎重に評価する必要がある多くの制限があります。このアプローチの最大の問題は、Promise にコールバックを追加するのは AngularJS であり、それをほとんど制御できないことです。

質問への回答:

1) 示されているように、成功/エラーのコールバックを追加するのは最終的に AngularJS であるため、ここではあまり制御できません。あなたができることは、解決を追跡するカスタムの約束に元の約束をラップすることです。しかし、この種の巧妙なキーストロークを節約するという全体的な目的。いいえ、「解決済み」のようなものはありません。要するに、すべての約束に対して機能する、進行状況を追跡するための普遍的なメカニズムはありません。promise が に基づいている場合は、進行中のリクエストを追跡するために$httpインターセプターまたはプロパティを使用できます。pendingRequests

2) できません。$parse繰り返しになりますが、サービス内にハンドラーを追加するのは AngularJS であり、次のようになりますpromise.then(function(val) { promise.$$v = val; });(コードはこちら)。成功のコールバックのみが追加されていることがわかるため、すべての失敗は黙って無視されます。

これらは、ビューでの自動プロミス解決の唯一の制限ではありません。もう 1 つの問題は、関数によって返される promise が正しく解決されないことです。たとえば、次のように例を書き直すとします。

myModule.controller('HelloCtrl', function($scope, HelloWorld) {

  $scope.messages = function() {
    return HelloWorld.getMessages();
  }
});

次のマークアップを使用してみてください。

<li ng-repeat="message in messages()"></li>

物事は期待通りに機能しますが、これは驚くべきことかもしれません。

つまり、Promise の自動解決は便利な近道のように思えるかもしれませんが、多くの制限と非自明な動作があります。それらを慎重に評価し、キーストロークをほとんど節約する価値があるかどうかを判断してください。

于 2013-06-24T14:07:38.050 に答える