2013-05-01 7 views
16

私は自分のUIにバインドすると約束しています。約束が解決され、UI要素がレンダリングされると、そのUI要素をクリックできます。私がクリックを処理するコントローラコードでは、私は約束の価値に基づいて行動したいと思います。私の角度コードのこの時点で、私はすでに約束が解決されていることを知っています。しかし、価値を得たいときは、それでも約束です。すでに解決された約束の価値を得るには?

私はそれが解決されている必要があります知っていることを約束の価値を得るために最善の方法は?

答えて

21

約束は常に約束されています。そして、そうするべきです。約束を直接ビューに結びつけることは可能ですが、私は透明性がなく、ちらつきを見ることができるので、一般的にはこの方法をお勧めしません。よりよい解決策はthen呼び出しでスコープ値を割り当てることです:

myService.then(function(val) { 
    $scope.val = val; 
}); 

$scope.valの準備ができたら、それは常に値として直接処理することができます - それはですので。

あなたが約束を直接したいのであれば、それを約束のように扱わなければなりません。つまり、promise.then(function() { ... });に電話する必要があります。これは不便だと思われますが、実際にはどれくらい強力な約束があるかの証です。

約束をもっと詳しく知りたい場合は、最新のGoogle+ハングアウトのアドバイスをして(そしてコード例を提供しました)、AngularJSの利点、一般的な使い方、ベストプラクティスについて説明しました。AngularJS Hangout -- Promises, Promises Promises, Promises終わりのない約束のアイデアは具体的に取り上げられましたが、私は頭の上からタイムコードを持っていません。

希望すると便利です。

+1

ありがとうございます!私はあなたのアドバイスを取って、 'then'関数でスコープ変数を割り当てました。そこからすべてが円滑に機能します。しかし、角度がこの機能を提供するため、約束に直接結びつけるのが理にかなっている具体的なケースがあるのであれば、私は興味があります。 – sthomps

+0

私はそのような事件は認識していません。私はその機能が主に利便性のために提供されていると思います。しかし、おそらく他の誰かが意見を持っています... –

+0

「あなたはこれをしたくない」という答えを与えることは、必ずしも有用ではありません。 Im私の場合私はデバッグしているので、私は確かにそれをしたいと思うし、私は約束の価値を得る方法がわからない。それはどういうわけか、確かに可能なはずです。 – Machisuji

0

プロミスが完全に満たされていない場合は、ちょっと待ってからもう一度テストして価値があるかどうかを確認することができます。しかし、MDNで説明されているように可能ではありません:

"JavaScriptイベントループの現在の実行が完了する前にコールバックが呼び出されることはありません。

したがって、現在起動している機能が実行されている限り、Promiseをフルにすることはできません。現在のイベントループの実行中には「値」はありません。 「プロミス」とは、「NEXTイベントループ実行中にあなたに提供することを約束します」を意味します。

グローバル変数にその約束を保存し、ユーザーがブラウザのボタンをクリックすると、イベントハンドラを実行して新しいイベントループを開始します。このイベントハンドラは、「when()」を約束しますその約束がその時点までに解決された場合、新しいwhen-functionは引数として得られる値をとり、それをあなたが読むことができる変数に保存するということです。それがコンソールにあることを確認するためにコンソールに書き込む必要はありません。

プロミスをコンソールに書き込むことはできますが、コンソールから読むことはできませんので、私のプログラムの残りの部分にどうすればいいですか?答え:現在のイベントループが終了するまで待ってください。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

関連する問題