使用 q.defer 延迟操作

我们可以使用 $q 将操作推迟到将来,同时在目前有一个待处理的 promise 对象,通过使用 $q.defer,我们创建一个将来解决或拒绝的承诺。

这种方法并不等同于使用 $q 构造函数,因为我们使用 $q.defer 来实现一个现有的例程,该例程可能会或可能不会返回(或者曾经返回)一个 promise。

例:

var runAnimation = function(animation, duration) {
    var deferred = $q.defer();
    try {
        ...
        // run some animation for a given duration
        deferred.resolve("done");
    } catch (err) {
        // in case of error we would want to run the error hander of .then
        deferred.reject(err);
    }
    return deferred.promise;
}

// and then
runAnimation.then(function(status) {}, function(error) {})
  1. 确保在调用 .then 时始终返回 deferred.promise 对象或冒错误

  2. 确保你始终解决或拒绝延迟对象,否则 .then 可能无法运行,并且你可能会发生内存泄漏