2017-04-12 26 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:很高兴帮助! *“我将编辑我的帖子”*为什么? –