是否有可能只在某个条件下返回一个承诺=== true否则等待(再试一次)?

时间:2014-11-05 04:14:36

标签: javascript angularjs promise angular-promise

所以我正在使用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来实现这一目标,但我想知道我是否可以完成同样的观察员。

1 个答案:

答案 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);
  });
};