在 Javascript 中使用承诺无效

Using promises in Javascript not working

我正在编写一个连接 Spotify API 的应用程序。这是我正在尝试做的基本流程。

  1. 用户输入艺术家,我得到艺术家的 spotify id。
  2. 我用那个 id 来查找相关的艺术家。
  3. 我存储了每个相关艺术家的热门曲目。
  4. 我为特定用户创建了包含这些歌曲的播放列表。

现在,这显然需要按特定顺序发生(我认为术语是同步的)。今天才刚接触到Promises,不知道怎么用。我相信这是一种将功能链接在一起以确保它们按特定顺序发生的方法。但是,我不知道该怎么做。

这是我尝试过的尝试:

angular.module('smart-spot', [])
    .controller('MainCtrl', [
        '$scope', '$http',
        function($scope, $http)
        {
            $scope.createPlaylist = function()
            {
                var artist = $scope.artist;
                console.log(artist);
                window.open("/login", "Playlist Creation", 'WIDTH=400, HEIGHT=500');
                var artistId;
                getArtistId(artist)
                    .then(function(response) //this is where the below error is referring to
                    {
                        artistId = response.data;
                        getRelatedArtists(artistId)
                            .then(function(response)
                            {
                                //this chaining doesn't appear to be working.
                            }, function(error)
                            {
                                return $q.reject(error);
                            })
                    }, function(error)
                    {
                        return $q.reject(error);
                    });
            };
            var getArtistId = function(artist)
            {
                $http.get('/search', { params:{ artist:artist } })
                    .then(function(response)
                    {
                        console.log(response);
                        return response;
                    }, function(error)
                    {
                        return $q.reject(error);
                    });
            };

            var getRelatedArtists = function(artist)
            {
                //get the related artists
            }
        }
    ]);

我在控制台中遇到一个错误,在上面标记的行中显示 TypeError: Cannot read property 'then' of undefined。因此,尝试将这些功能链接在一起并没有像我想要的那样工作。

我错过了什么?

您的 getArtistId 不是 return 承诺对象,因为它使用 ajax,您可以 return 相同的承诺 return $http.get() 通话

$scope.createPlaylist = function() {
  var artist = $scope.artist;
  console.log(artist);
  window.open("/login", "Playlist Creation", 'WIDTH=400, HEIGHT=500');
  var artistId;
  getArtistId(artist)
    .then(function(response) //this is where the below error is referring to
      {
        artistId = response.data;
        //same way getRelatedArtists has to return a promise
        getRelatedArtists(artistId)
          .then(function(response) {
          }, function(error) {
            //handle the error if you want to
          })
      },
      function(error) {
        //no need to return anything here, if you want to display an error message to the user you can do that here
      });
};
var getArtistId = function(artist) {
  return $http.get('/search', {
    params: {
      artist: artist
    }
  });
};