如何推迟承诺链?我需要这个,因为我想在继续使用脚本之前等待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)。 –