所以我正在使用angularJS和$q
服务。但为了简单起见,我使用$timeout
,因为它创造了一个承诺。
问题:
是否有可能只在条件满足时才返回承诺?对于此示例,我想等到carousel.params.caruselReady
返回true,然后再转到下一个.then
。
$timeout(function(){
if(Carousel.params.ready()){
return ready;
}
},0).then(function(ready){
//...do stuff..//
}
Carousel.params.ready来自Carousel.js
工厂:
//this function gets called everytime a image has been loaded. when all images are rendered than carousel is ready
carouselElLoaded: function (result) {
var count = 1;
Carousel.params.pageRenderedLength += count;
if (Carousel.params.pageRenderedLength >= Carousel.params.pageLength) {
Carousel.params.carouselReady = true;
}
},
最后,从wa.pages.js
(指令)调用carouselElLoad
$img.onload = function (e) {
var self = this;
$timeout(function () {
return self;
}, 0).then(function () {
Carousel.set.carouselElLoaded(e);
});
};
目前,我正在使用$watch
来实现这一目标,但我想知道我是否可以完成同样的观察员。
答案 0 :(得分:1)
您可以使用promise而不是布尔标志,它将完全按照您的意愿执行。
在Carousel.js
中定义一个承诺名称isCarouselReady并在轮播准备就绪后解析它,你的代码应该是这样的:
// During the initialisation of your factory
var carouselDeferred = $q.defer()
Carousel.params.isCarouselReady = carouselDeferred.promise;
//this function gets called everytime a image has been loaded. when all images are rendered than carousel is ready
carouselElLoaded: function (result) {
var count = 1;
Carousel.params.pageRenderedLength += count;
if (Carousel.params.pageRenderedLength >= Carousel.params.pageLength) {
carouselDeferred.resolve(/* What ever you'd like here */);
}
},
现在你需要做的就是:
Carousel.params.isCarouselReady.then(function() {
// Your logic
});
如果它看起来像这样,你的最后一部分会更好:
$img.onload = function (e) {
$scope.$apply(function(){
Carousel.set.carouselElLoaded(e);
});
};