使用 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 可能無法執行,並且你可能會發生記憶體洩漏