3

我有一个由自定义 AJS 指令使用的通用 AJS 服务。
我需要保留我的指令,直到服务中的承诺得到解决。根据我的阅读,这是通过指令控制器完成的,但除了路由之外,我没有看到任何示例。

我如何延迟我的指令直到服务承诺得到解决?

在此处输入图像描述

4

1 回答 1

0

我也有类似的情况。我的指令必须等待第三方库完成一些 DOM 操作。我使用重试函数每 50 毫秒检查一次,以查看我需要的 DOM 元素是否存在。

在指令中:

Utils.retry(function() { return !!$(selector)[0]; }, 50, 10).then(function() {         
  doSomethingInterestingWith($(selector));
});

重试函数(我在 Utils 服务中定义):

var retry = function(fn, interval, maxTries) {
  var result, deferred;
  deferred = $q.defer();

  // if we get a result, return it
  result = fn();
  if (result !== false) { deferred.resolve(result); }

  else {
    // if we've run out of tries, return false
    if (maxTries) { maxTries -= 1; }
    if (maxTries === 0) { deferred.reject('timed out'); }

    // otherwise try again after interval
    else {
      $timeout(function() {
        deferred.resolve(retry(fn, interval, maxTries));
      }, interval);
    }
  }

  return deferred.promise;
};

Utils.retry = retry;

请参阅plunk以获取工作示例。

于 2013-12-29T13:00:21.763 回答