Javascript 在AngularJS中处理$q.all和承诺时出错

Javascript 在AngularJS中处理$q.all和承诺时出错,javascript,angularjs,angular-resource,Javascript,Angularjs,Angular Resource,给定以下代码: function Ctrl($scope, $http, $q) { var search = function(name) { if (name) { $http.get('http://api.discogs.com/database/search?type=artist&q='+ name +'&page=1&per_page=5'). success(function(data3) { $

给定以下代码:

function Ctrl($scope, $http, $q) {
  var search = function(name) {
    if (name) {
      $http.get('http://api.discogs.com/database/search?type=artist&q='+ name +'&page=1&per_page=5').
        success(function(data3) {
          $scope.clicked = false;
          $scope.results = data3.results;
        });
    }
    $scope.reset = function () {
      $scope.sliding = false;
      $scope.name = undefined;
    };
  };
  $scope.$watch('name', search, true);

var done = $scope.getDetails = function (id) {
    $scope.clicked = true;
    $scope.sliding = true;
    var api = 'http://api.discogs.com/artists/';
    return $q.all([$http.get(api + id),
                  $http.get(api + id + '/releases?page=1&per_page=100')]);
};

done.then(function (){
 $scope.releases = data2.releases;
 $scope.artist = data;
 return $http.get('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=e8aefa857fc74255570c1ee62b01cdba&artist=' + name + '&album='+ title +'&format=json');
});
我收到以下控制台错误:

TypeError: Object function (id) {
    $scope.clicked = true;
    $scope.sliding = true;
    var api = 'http://api.discogs.com/artists/';
    return $q.all([$http.get(api + id),
                  $http.get(api + id + '/releases?page=...<omitted>... } has no method 'then'
at new Ctrl (file:///C:/Users/Zuh/Desktop/AngularJS%20Discogs/js/services.js:27:9)
TypeError:对象函数(id){
$scope.clicked=true;
$scope.slideing=true;
var-api='1〕http://api.discogs.com/artists/';
返回$q.all([$http.get(api+id)),
$http.get(api+id+'/releases?page=..}没有方法“then”
按新的Ctrl键(file:///C:/Users/Zuh/Desktop/AngularJS%20Discogs/js/services.js:27:9)
有人能告诉我错误在哪里吗?我正在定义。然后在执行getDetails之后


这是一张。

这是你的最新照片

总结如下:

  • 将$q.all().then()部分移动到done方法中

  • 请更加注意处理程序在
    部分中收到了哪些参数,然后是
    部分


现在它给了我一个引用错误:id没有定义。我已经更新了Plunker。它应该来自第一个$http的id(上面的代码中没有显示,但Plunker中显示了)。我对Angular(还有Javascript)还不熟悉有时很难跟踪信息流……id来自一个JSON响应,该响应使用以下命令调用:$http.get('name+'&page=1&per_page=5')。成功(函数(data3){$scope.clicked=false;$scope.results=data3.results;});让我们@EricMitjans为您的工作感到高兴。尝试为服务iteraction编写测试,或者只是调试/跟踪以控制您从ajax接收到的内容calls@EricMitjans我注意到您对angular中的承诺还有其他问题。请查看egghead.io并从这个视频开始
angular.module('myApp', ['ngResource']);

  function Ctrl($scope, $http, $q) {
    var search = function(name) {
      if (name) {
        $http.get('http://api.discogs.com/database/search?type=artist&q='+ name +'&page=1&per_page=5').
          success(function(data3) {
            console.log(arguments)
            $scope.clicked = false;
            $scope.results = data3.results;
          });
      }
      $scope.reset = function () {
        $scope.sliding = false;
        $scope.name = undefined;
      };
    };
    $scope.$watch('name', search, true);

    var done = $scope.getDetails = function (id) {
        $scope.clicked = true;
        $scope.sliding = true;
        var api = 'http://api.discogs.com/artists/';
        var q =  $q.all([$http.get(api + id),
                      $http.get(api + id + '/releases?page=1&per_page=100')])
                  .then(function (ret){
                     //console.log(arguments)

                     $scope.releases = ret[1].data.releases;
                     $scope.artist = ret[0];
                     return $http.get('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=e8aefa857fc74255570c1ee62b01cdba&artist=' + name + '&album='+ title +'&format=json');
                   })

        return q
      };

  }