2016-07-07 57 views
1

對不起,我不能在這裏顯示完整的代碼,我想出了以下代碼片段。 我有一個服務和控制器。 在服務中,我添加了2秒超時到我的組服務來測試微調加載。角度承諾延遲不按預期方式工作

但以某種方式在控制器中,我的代碼馬上運行,無需等待2秒鐘。

我做了3個破發點,執行我所期望的順序爲:2-> 1-> 3 但是,它結束了與2-> 3-> 1

這裏是我的服務。

groupService.get = function() { 
    var deffered = $q.defer(); 
    deffered.promise = $getMyDataStuffPromise.then(function (data) { 
     $timeout(function() { 
      deffered.resolve(); <- break point 1 
     }, 2000); 
    }, function (error) { 
     deffered.reject(); 
     console.log('group error', error); 
    }); 

    return deffered.promise; <- break point 2 
}; 

控制器:

$q.all([ 
     PeopleSvc.get(), 
     GroupSvc.get() 
    ]).then(function(data){ 
      console.log('data returns, stop spinner'); <- break point 3 
     }); 

請你讓我知道什麼是錯的代碼?謝謝!

回答

3

deffered.promise =是非常奇怪的(我不知道還有什麼可以稱之爲)。

但是你甚至不應該試圖執行deferrred antipattern$timeout已經返回一個承諾,讓所有你需要做的,是給他們鏈條:

groupService.get = function() { 
    return $getMyDataStuffPromise.then(function (data) { 
     return $timeout(function() { 
      return undefined; // maybe data? 
     }, 2000); 
    }); 
}; 
+0

非常感謝你! – innek

1

那麼這個問題的答案是:你必須分配給deferred.promise錯誤的東西,所以它不工作

groupService.get = function() { 
    var deffered = $q.defer(); // deferred.promise already generated here 
    /*deffered.promise = */$getMyDataStuffPromise.then(function (data) { 
     $timeout(function() { 
      deffered.resolve(); 
     }, 2000); 
    }, function (error) { 
     deffered.reject(); 
     console.log('group error', error); 
    }); 

    return deffered.promise; 
}; 

當您撥打$q.defer()時,已經生成了一個新的承諾對象,您將其重新分配給$getMyDataStuffPromise,當然它會在早期解決。只需刪除該任務即可。

當然,如你所願,儘可能遠離promise-antipattern,正如其他文章中的建議。

+0

謝謝!這解釋了爲什麼這個承諾過早返回。 – innek