2016-02-05 33 views
0

我有一个有趣的情况,我从一个GET请求获得一个id列表,然后我想抓住第一个GET请求获取该对象的图像url。不幸的是,有时从第一个GET请求返回的ID无效,我们需要再检查下一个ID。我目前正在尝试一些递归回调的方式,但这并不是我想做的事情,我只是因为Angular的异步性质而没有得到任何结果。Angular nested GETs

这里是我的代码示例:

app.controller('gr_menu', function($scope, grAPI, flashManager, catalogAPI) { 
$scope.reports = []; 

grAPI.ReportList().then(
    function(success) { 
    success.data.forEach(function(report) { 
     if(report.live) { 
     $scope.reports.concat({'id': report.id, 'title': report.game, 'imgUrl': getReportData(report)}); 
     } 
    }); 
    }, 
    function(error) { 
    flashManager.flashMessage('Danger', 'Failed to load game reports: '+error); 
    }); 

function getReportData(report) { 
    catalogAPI.SearchGame(report.game, [{"json.offerType":"Base Game"}]) 
    .then(function(success){ 
     var i = 0; 
     return checkOfferID(success.data.result[i].offerId, function (result) { 
     i++; 
     console.log(result) 

     if (result != false) { 
      return checkOfferID(success.data.result[i].offerType); 
     } else { 
      return result; 
     } 
     }); 
    }); 
} 

function checkOfferID(offerID) { 
    Origin.games.catalogInfo(offerID) 
    .then(function (catData) { 
     return catData.customAttributes.imageServer + catData.localizableAttributes.packArtLarge; 
    }, function (catErr) { 
     return false; 
    }); 
    } 
}); 

所以它实际上是3个GET请求深。首先是获取我们的“报告”列表,然后从那里获取这些报告中指示的游戏的ID,然后从那里获取图像。

我没有从那个console.log得到任何东西,所以也许我误解了这个回调应该如何工作。我仍然试图熟悉使用Angular和回调。我会通过一个简单的for循环来实现它,如果它是python,就会中断它。

+0

你的getReportData没有返回任何东西。你也不是递归调用任何东西,你只是调用第一个和第二个元素的checkOfferId()。你应该看看承诺如何工作。 – Cameron

+0

是否有可能加入服务器上的所有数据,所以你会从客户端做一个请求?在你的情况下,你正在做〜(1 + n * 2)个请求,这不是最佳实践。 –

+0

不幸的是,除了第一个,我无法控制这些apis。或者我肯定会走这条路线,而不是进行嵌套呼叫。 – user1475573

回答

0

我真的不能让你的代码的感觉(我还让我与angularJS第一步),但我认为你使用一个控制器模块要像下面的“app.js”(简单的例子,服务):

angular.module('testApp', []) 
    .controller('TestCtrl', ['$log','TestService', 
     function($log, TestService) { 
     var self = this; 
     TestService.getUserList().then(function (ld) { 
      TestService.getUserInfo().then(function(ud){ 
      //$log.log(ud.data.args.url); 
      self.photo_url = ud.data.args.url; 
      }) 
     }); 
    }]) 
    .factory('TestService', ['$log', '$http', function($log, $http) { 
    return { 
     getUserList: function() { 
     return $http.get('https://httpbin.org/get?list=[{id:1,%20name:%20%22jhon%22},{id:2,%20name:%22Lewis%22}]') 
     }, 
     getUserInfo: function() { 
     return $http.get('https://httpbin.org/get?id=1&name=jhon&url=https://www.gravatar.com/avatar/346173670fc42829e26d7965cbc5c3e0') 
    } 
    }; 
    }]); 

然后你可以绑定 “PHOTO_URL” 价值的HTML,像(index.html的):

<html ng-app="testApp"> 
    <body ng-controller="TestCtrl as testCtrl"> 
     <img ng-src='{{testCtrl.photo_url}}' alt="something kwel"/> 
     <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.js"> 
     </script> 
     <script src="app.js"></script> 
    </body> 

</html> 

希望有了解你想要什么,并希望这有助于你也是。

注意:测试从http bin的嘲弄的URL。

+1

你不能返回异步检索到的'photo_url'。该服务方法需要返回一个承诺 – charlietfl

+0

关于那真的很抱歉,我现在已经进行了测试。我弄错了这部分,感谢评论帮助我理解它! = d – jlnabais