通常、then()
promiseを使用する場合は、呼び出しとチェーンの動作を伴う継続コードを添付するだけであることを理解しています。
ただし、プロミスでラップされた非同期呼び出しを開始してから、3秒を個別に開始して$timeout()
、元のプロミスがまだ完了していない場合にのみUIアクションを実行できるようにします。(これは、低速接続、3G上のモバイルデバイスなどでのみ発生すると予想されます)
約束が与えられたら、ブロックしたり待ったりせずに、それが完了したかどうかを確認できますか?
通常、then()
promiseを使用する場合は、呼び出しとチェーンの動作を伴う継続コードを添付するだけであることを理解しています。
ただし、プロミスでラップされた非同期呼び出しを開始してから、3秒を個別に開始して$timeout()
、元のプロミスがまだ完了していない場合にのみUIアクションを実行できるようにします。(これは、低速接続、3G上のモバイルデバイスなどでのみ発生すると予想されます)
約束が与えられたら、ブロックしたり待ったりせずに、それが完了したかどうかを確認できますか?
回答:
これはAngularの最近のバージョンで追加されたと思いますが、promiseには$$ stateオブジェクトがあるようです。
var deferred = $q.defer();
console.log(deferred.promise.$$state.status); // 0
deferred.resolve();
console.log(deferred.promise.$$state.status); //1
コメントに記載されているように、Angularバージョンをアップグレードするときに破損する可能性があるため、これはお勧めしません。
$$...
プロパティは使用すべきではないと書かれています。...角の新しいバージョンにアップグレードするときは危険かもしれない
inspect
関数を実装していませんでした。したがって、Angular開発者にとってはジュースはありません。Promiseプロトタイプにはそれがありません。
(Angularソースを変更してプルリクエストを送信せずに)そのままで最善のオプションは、promiseが解決されたかどうかのローカルフラグを保持することだと思います。関心のあるプロミスを設定するたびにリセットthen()
し、元のプロミスので完了としてマークします。で$timeout
then()
、元の約束はまだ解決したりしていない場合は、チェックフラグが知っています。
このようなもの:
var promiseCompleted = false;
promise.then(function(){promiseCompleted=true;})
$timeout(...).then(function(){if(!promiseCompleted)doStuff()})
Kris Kowalの実装には、約束の状態をチェックするための他の方法が含まれ$q
ていますが、残念ながらAngularの実装にはこれらが含まれていないようです。
@shaunhusainがすでに述べたように、それは可能ではないようです。しかし、多分それは必要ではありません:
// shows stuff from 3s ahead to promise completetion,
// or does and undoes it in one step if promise completes before
$q.all(promise, $timeout(doStuff, 3000)).then(undoStuff);
または多分より良い:
var tooSlow = $timeout(doStuff, 3000);
promise.always(tooSlow.cancel);
約束が戻ったかどうかを確認する必要がある同様の問題が発生しました。$watch
新しい値と古い値の両方が定義されていない場合でも、AngularJSの関数はページのレンダリング中に変更を登録するため、外部モデルに保存する価値のあるデータがあるかどうかを確認する必要があります。
それは間違いなくハックですが、私はこれを行います:
$scope.$watch('userSelection', function() {
if(promiseObject.hasOwnProperty("$$v"){
userExportableState.selection = $scope.userSelection;
}
};
$$v
これはAngularJSで使用される内部変数であることは知っていますが、解決された約束の指標としては非常に信頼できます。AngularJS 1.2にアップグレードするとどうなるかは誰にもわかりません:-/ $q
1.2のドキュメントに改善点についての言及はありませんが、おそらく誰かがQに近いより優れた機能セットを備えた代替サービスを作成するでしょう。
正確なシナリオはわかりませんが、非同期呼び出しを行った(そしてpromiseを生成した)直後にタイムアウトを設定するのが一般的です。
提供setTimeout()
の文は、非同期呼び出しと同じイベントスレッドである、あなたはレースの影響の可能性について心配する必要はありません。javascriptは厳密にシングルスレッドであるため、promiseの.then()
コールバックは後のイベントスレッドで発生することが保証されています。