如何推遲承諾鏈?我需要這個,因爲我想在繼續使用腳本之前等待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:改善與建議的代碼從@sdgluck
編輯2:一些澄清的主要問題的:
爲了澄清的主要問題一bit more: 我可以在我的代碼中使用這種構造嗎?
// 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)。 –