2014-10-07 24 views
0

我有一些服務來獲取和共享多個控制器和工廠之間的服務器的數據提供者。當我加載頁面時,一些工廠可以調用相同的服務函數來獲取服務器數據。它對同一個API資源產生多個HTTP調用。我有一個最低限度的控制來將API數據保存到變量,並且轉發呼叫使用此數據。我希望避免這一點。我可以做一個請求和其他數據請求等待完成第一個請求嗎?

實際實現的例子:

function getAllCategories() { 
     var deferred = $q.defer(); 

     if (categoriesInitialized == 1) { 
      deferred.resolve(categories); 
     } 
     else { 
      categoriesInitialized = 0; 
      categoryApiMethods.getAll(function (result) { 
       for (var i = 0; i < result.length; i++) { 
        if (!checkCategoryExists(result[i])) 
         categories.push(new categoryModel(result[i])); 
       } 
       categoriesInitialized = 1; 

       deferred.resolve(categories); 
      }, function (data, status, header, config) { 
       //toaster.pop('error', data); 
       deferred.reject(data, status, header, config); 
      }); 
     } 

     return deferred.promise; 
    } 

回答

1

只是一個裝載值添加到您的邏輯,並保存掛起的承諾來解決加載完成時的數組。

function getAllCategories() { 
    var deferred = $q.defer(); 

    if (!loading && categoriesInitialized == 1) { 
     deferred.resolve(categories); 
    } 
    else if (!loading) { 
     categoriesInitialized = 0; 
     loading = true; 
     categoryApiMethods.getAll(function (result) { 
      for (var i = 0; i < result.length; i++) { 
       if (!checkCategoryExists(result[i])) 
        categories.push(new categoryModel(result[i])); 
      } 
      categoriesInitialized = 1; 
      loading = false; 

      deferred.resolve(categories); 
       waiting.forEach(function(promise) { 
      promise.resolve(categories); 
     } 
     }, function (data, status, header, config) { 
      //toaster.pop('error', data); 
      deferred.reject(data, status, header, config); 
waiting.forEach(function(promise) { 
      promise.reject(....); 
     } 
     }); 
    } else { 
     waiting.push(deferred.promise); 
    } 

    return deferred.promise; 
    } 
+0

謝謝您的解決方案。我需要重寫你的代碼的一些行。我編輯了你的解決方案來解決一個錯誤,並把更多的完成。 – Daniel 2014-10-09 10:13:30