プロミスチェーンをどのように遅延させることができますか?私はCSSアニメーションが完成するのを待ってからスクリプトを続行したいので、これが必要です。ファンクションを延期する方法
この関数の目的は、ビューを開くことです。ビューがまだ開いていない場合は、(クラスを変更して)開いて、CSSアニメーションを待ってください。ビューがすでに開いている場合は、何も実行せずに続行します。
私はこのような関数を呼び出したい: (それは角コントローラ内の関数である)
$scope.openView(viewId).then(function() {
$scope.openAnotherView(anotherViewId);
});
/** Function to open some view **/
$scope.openView = function (viewId) {
function timeout(delay) {
return new Promise(function(resolve, reject) {
$timeout(resolve, delay);
});
}
// Check if view is already open
if ($scope.viewId != viewId) {
$scope.viewId = viewId;
// get data from ajaxcall (also a promise)
return MyService.getData(viewId).then(function(data) {
// add data to view
// change class to open view
// this is working ok!
}).then(function() {
return timeout(30000 /* some large number (testing purpose) */)
});
} else {
// view is already open, so return here we don't have to wait
// return empty promise, with no timeout
return new Promise(function(resolve, reject) {
resolve()
});
}
}
このコードは動作しますが、遅延が動作していません。私のアプローチは大丈夫ですか?私はここで何が欠けていますか?
編集1:メイン質問Aを明確に
:主な問題のいくつかの明確化:
@sdgluck
から提案編集2でコードを改善もう少し: 私のコードでこの構造を使うことはできますか?
// code doesnt know wheter to wait or not
// can the Promise do this?
openView().then(function() {
openAnotherView();
}
成果1:
ブラウザはopenView()
を呼び出しますが、それは既に開いているので、それだけですぐに(遅延なし)openAnotherView()
を呼び出します。
成果2:
図がopenView()
が遅れ、その後、それを開きます(?または@Dominicトビアスが指摘するように、eventlisterを追加)し、いくつかの遅延の後openAnotherView()
を呼び出して、開いていません。
ありがとうございました!
編集3:問題とフィドルを追加しましたが http://jsfiddle.net/C3TVg/60/
私はあなたが間違った方法でこれを行うかもしれないと思います。代わりに[this](https://davidwalsh.name/css-animation-callback)のようにアニメーションが完了したかどうかを検出したいかもしれないように思えます。 –