2017-04-12 60 views
1

我創建了以下控制器,其中3個不同$ http GET調用了rest-api。REST-api上的同步查詢的隨機結果

$http({method: 'GET', url: REST_CONFIG.url+'/api/lims/data/runs/list'}) 
     .success(function(data, status, headers, config) { 
      form.runs = data; 
     }) 
     .error(function(data, status, headers, config) { 
      form.runs = []; 
     }); 
     form.data.analysis = {"analysisName": "","analysisprofile": {"workflows": []},"run": ""}; 
     //Get all Default Workflows 
     $http({method: 'GET', url: REST_CONFIG.url+'/api/workflows/default/list'}) 
     .success(function(data, status, headers, config) { 
      form.workflows = data; 
     }) 
     .error(function(data, status, headers, config) { 
      form.workflows = []; 
     }); 
     //Get all databases 
     $http({method: 'GET', url: REST_CONFIG.url+'/api/list-databases'}) 
     .success(function(data, status, headers, config) { 
      form.databases = data; 
     }) 
     .error(function(data, status, headers, config) { 
      form.databases = []; 
     }); 

有時我從查詢1和查詢2(查詢2具有查詢1的結果)的結果相同。在這種情況下,rest-api執行query1的2倍。我的瀏覽器說,http查詢是好的(3種不同的url)。這很奇怪,真的很煩人。 我也試過:

 //Get all runs 
     runs = $http({method: 'GET', url: REST_CONFIG.url+'/api/lims/data/runs/list'}); 
     //Get all Default workflows 
     defaultWorkflows = $http({method: 'GET', url: REST_CONFIG.url+'/api/workflows/default/list'}); 
     //Get all databases 
     databases = $http({method: 'GET', url: REST_CONFIG.url+'/api/list-databases'}); 
     $q.all([runs, defaultWorkflows, databases]).then(function(values) { 
      form.runs = values[0].data; 
      form.workflows = values[1].data; 
      form.databases = values[2].data; 
     }); 

沒有工作。 它來自rest-api嗎?或者我做錯了什麼?

編輯 問題解決了。關鍵是使用$ q和promise和deffer()。這plunkr幫了我很多:http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview

我使用下面的代碼:

var getInfo = function(){ 
     var promises = []; 
     var urls = []; 
     urls.push(REST_CONFIG.url+'/api/lims/data/runs/list'); 
     urls.push(REST_CONFIG.url+'/api/workflows/default/list'); 
     urls.push(REST_CONFIG.url+'/api/list-databases'); 
     angular.forEach(urls, function(url){ 
      var deffered = $q.defer(); 
      $http({method: 'GET', url: url}) 
      .then(function successCallback(response) { 
       deffered.resolve(response.data); 
      }, function errorCallback(response) { 
       deffered.reject(); 
      }); 
      promises.push(deffered.promise); 
     }) 
     return $q.all(promises); 
    } 


    var init = function(){ 
     var promiseInfo = getInfo(); 
     promiseInfo.then(function(datas){ 
      form.runs = datas[0]; 
      form.workflows = datas[1]; 
      form.databases = datas[2]; 
     }) 
    }; 
+0

在你的第一個例子中,你如何/在哪裏使用'forms'?聽起來好像你只是在通話完成之前使用它,但我們不能說,因爲你沒有顯示。 –

+0

你使用什麼版本的角? 從版本1.6成功和$ http的錯誤被刪除... http://www.codelord.net/2015/05/25/dont-use-%24https-success/ –

+1

你不應該使用'.success '。它已被棄用,並從最新的角色版本中刪除。 http://stackoverflow.com/a/35331339/2495283 – Claies

回答

0

您需要一定要等到所有的請求使用forms,例如,通過使用$q.all前完成。此外,請務必使用thencatch; successerror是在V1.5棄用回:

function getInfo() { 
    // Assuming `form` exists here... 
    var promises = []; 
    promises.push(
     $http({method: 'GET', url: REST_CONFIG.url+'/api/lims/data/runs/list'}) 
      .then(function(data, status, headers, config) { 
       form.runs = data; 
      }) 
      .catch(function(data, status, headers, config) { 
       form.runs = []; 
      }) 
    ); 
    form.data.analysis = {"analysisName": "","analysisprofile": {"workflows": []},"run": ""}; 
    //Get all Default Workflows 
    promises.push(
     $http({method: 'GET', url: REST_CONFIG.url+'/api/workflows/default/list'}) 
      .then(function(data, status, headers, config) { 
       form.workflows = data; 
      }) 
      .catch(function(data, status, headers, config) { 
       form.workflows = []; 
      }) 
    ); 
    //Get all databases 
    promises.push(
     $http({method: 'GET', url: REST_CONFIG.url+'/api/list-databases'}) 
      .then(function(data, status, headers, config) { 
       form.databases = data; 
      }) 
      .catch(function(data, status, headers, config) { 
       form.databases = []; 
      }) 
    ); 
    return $q.all(promises).then(() => form); 
} 

返回將解析form當所有三個請求的完成(它不會拒絕,因爲拒絕被通過變成分辨率的承諾處理程序,與您的原始代碼保持一致)。

+0

它與$ q.all很好地工作,並承諾非常感謝你!我將編輯我的帖子。 – JBeghain

+0

@JBeghain:很高興幫助! *「我將編輯我的帖子」*爲什麼? –