Wie kann ich eine Kette von Versprechen verzögern? Ich brauche das, weil ich auf eine CSS-Animation warten möchte, bevor ich mit dem Skript fortfahre.Wie verzögert man ein Versprechen in der Funktion
Zweck der Funktion ist das Öffnen einer Ansicht. Wenn die Ansicht nicht bereits geöffnet ist, öffnen Sie sie (indem Sie eine Klasse ändern), warten Sie auf die CSS-Animation und fahren Sie fort. Wenn die Ansicht bereits geöffnet ist, tun Sie nichts und fahren Sie fort.
Ich möchte die Funktion wie folgt nennen: (es eine Funktion in einem Winkelregler)
$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()
});
}
}
Dieser Code funktioniert, aber die Verzögerung funktioniert nicht. Ist meine Vorgehensweise in Ordnung? Was fehlt mir hier?
Edit 1: verbessert den Code mit dem Vorschlag von @sdgluck
Edit 2: Einige Klärung der Hauptfrage:
die Hauptfrage eine Klarstellung etwas mehr: Kann ich diese Konstruktion in meinem Code verwenden?
// code doesnt know wheter to wait or not
// can the Promise do this?
openView().then(function() {
openAnotherView();
}
Ergebnis 1:
der Browser openView()
nennen, aber da es bereits es öffnet openAnotherView()
nur sofort anrufen (keine Verzögerung).
Ergebnis 2:
Die Ansicht nicht geöffnet ist, openView()
wird es so öffnen, dann eine Verzögerung (? Oder als @Dominic Tobias weist darauf hin, eine eventlister hinzufügen), dann openAnotherView()
nach einer gewissen Verzögerung nennen.
Danke für jede Hilfe!
bearbeiten 3: eine Geige mit dem Problem Hinzugefügt erklärt http://jsfiddle.net/C3TVg/60/
Ich denke, Sie können dies in die falsche Richtung gehen. Es klingt, als ob Sie möchten, dass die Animation wie [this] (https://davidwalsh.name/css-animation-callback) abgeschlossen wird. –