2016-01-08 129 views
1

我为我写了一个简单的承诺。两者几乎相同,都调用HTTP GET。如何正确承诺(角度)

为什么我做到了: 第一个端点是我CONTROLE下,但第二个是一些老又慢WS,我想从我的终点instatly ATLEAST显示用户自己的数据,只是后面添加数据的其余

  • 1号终点 - 以各地45ms秒获得响应 - 的getData()
  • 二路终点 - 以是有问题的,并需要大约2.5 - 3秒 - getSoapData()

我怎么做的:

function getData() { 
     var myPromise = $http({ 
      method: 'GET', 
      url: 'URL' + $scope.vin, 
      headers: {Authorization: 'TOKEN'} 
     }); 
     return myPromise; 
    }; 

    function getSoapData() { 
     var myPromise = $http({ 
      method: 'GET', 
      url: 'URL=' + $scope.vin, 
      headers: {Authorization: 'TOKEN'} 
     }); 
     return myPromise; 
    }; 

    $scope.findCases = function() { 
     getData().then(function (data) { 
      $scope.cases = data.data; 
      getSoapData().then(function (soapData) { 
       $scope.soapCases = soapData.data; 
      }); 
     }); 
    }; 

哪里是一个问题: 不知怎的,我在我的应用程序看到承诺的工作,因为它的getData显示我的第一个结果后,从getSoapData但是我有问题,时间: 当我查询只是getData网络说它需要45ms以上,当我用这个findCases并调用浏览器两个网络选项卡,提到说2,7s getData和45毫秒getSoapData

我希望我没有正确地创建我的承诺或我做了一些其他的跛mystake,但无法找到它是什么。 任何想法我做错了什么?

+0

在findCases寻找功能getSoapData无处依靠的getData。你为什么不想锁链? –

回答

1

您确定要正确解释网络数据吗?我没有看到你的承诺有什么问题,除了我不确定你为什么不是异步调用两个端点。

这是不是可取:

function displayData(result) { 
    $scope.cases = result.data; 
} 

function displaySoap(result) { 
    $scope.soapCases = result.data; 
} 

$scope.findCases = function() { 
    getData().then(displayData); 
    getSoapData().then(displaySoap); 
} 

这样两个呼叫都在同一时间做出让你避免了等待第一个电话解决您的SOAP调用更快的响应。

0

您可以结合诺言所以他们会并行运行,像这样:

var promise1 = $http({ 
    method: 'GET', 
    url: 'URL' + $scope.vin, 
    headers: {Authorization: 'TOKEN'} 
}); 
var promise2 = $http({ 
    method: 'GET', 
    url: 'URL=' + $scope.vin, 
    headers: {Authorization: 'TOKEN'} 
}); 

$q.all([promise1, promise2]).then(function(data){ 
    $scope.cases = data[0].data; 
    $scope.soapCases = data[1].data; 
}); 
+0

这意味着整个链需要在显示任何数据之前解决,这正是OP想要避免的。 –