2017-02-15 51 views
-1
function get (id, ignore) { 
    var deferred = $q.defer(); 

    $http.get('v1/info/' + id, { 
     ignoreAuthModule: ignore 
    }) 
     .success(function (data) { 
     deferred.resolve(data.data); 
     }) 
     .error(function (reason) { 
     deferred.reject(reason.message);); 
     }); 

    return deferred.promise; 
    } 

init(); 

function init(){ 
users.get($routeParams.id) 
    .then(function (data) { 
     if(data.has_something === 1){ 
      $scope.hasSomething = true; 
     }else{ 
      $scope.hasSomething = false; 
     } 

    }); 
} 

我使用的承諾,抓取信息從初始化函數的服務,獲得有關用戶的信息服務 //如果我調用init函數這應該叫兩次從一個功能初始化和我是來自服務 調用它,我怎麼能阻止兩次調用API,我的意思是它應該調用,如果已經調用一次一次通話HTTP請求使用angularjs

+0

您可以將用戶信息存儲在範圍變量中供以後使用。 – Jenny

回答

3

您在此處使用顯式承諾創建反模式,並且您的代碼可能更簡單。以下是如何使用memoization避免向同一用戶請求兩次:

.factory('users', ['$http', function ($http) { 
    var userPromises = {}; 

    function get (id, ignore) { 
     if (!userPromises[id]) { 
      userPromises[id] = $http.get('v1/info/' + id, { 
       ignoreAuthModule: ignore 
      }) 
      .then(function (data) { 
       return data.data; 
      }) 
      .catch(function (reason) { 
       throw new Error(reason.message); 
      }); 
     } 

     return userPromises[id]; 
    } 

    return { 
     get: get 
    }; 
}); 
+0

比接受的答案更好的方法 –

+0

@JLRishe一旦從api完成更改,如果從數據庫更新了項目並且我們不重載它應該調用否則拒絕該承諾 – user6606700

-1

您可以將您的deferred.promise一些變量,然後返回一個變量,而之前你http調用只是檢查該變量是否已定義

function get (id, ignore) { 
    if (angular.isUndefined(user)) { 
    var deferred = $q.defer(); 

    $http.get('v1/info/' + id, { 
     ignoreAuthModule: ignore 
    }).then(function(response) { 
     if (response.status == 200) { 
     deferred.resolve(response.data); 
     } else { 
     deferred.reject(response.data); 
     }; 

    user = deferred.promise; 
    return user; 
    } else { 
    return user; 
    } 
    } 

這樣你的api只會被調用一次。

+2

好方法,但... 1)您已經實現了延期反模式,2)'成功'和'錯誤'在Angular 1.6中被棄用和去除,3)您使用隱式全局變量'user' – Phil

+0

感謝@Phil指出了這一點。我只是使用了有問題的代碼,然後使用 –

+1

來更新我的答案。這隻允許檢索一個用戶。如果他們需要使用ID 9查詢用戶,然後使用ID爲14的用戶呢?這兩次都會爲同一個用戶返回一個承諾。 – JLRishe