2016-04-07 12 views
0

私はSpotifyにサインインして実行するのをやめていました私のアプリケーションではのサービスからデータが取得されていますが、コードが完全に停止することが約束されています。Javascript約束と更新の変数

$scope.tracks = []; 

    $scope.getTracks = function() { 
    var tracks = {}, 
      i; 
     for (i = 0; i < Tracks.uris.length; i++) { 
      console.log('Getting Track ' + i); 
      tracks[i] = SpotifyService.getTrack(Tracks.uris[i].id, Tracks.uris[i].loved, Tracks.uris[i].from); 
     } 
     return tracks; 
    } 

    $scope.refresh = function() { 
    console.log('Refresh Tracks Started'); 
    $scope.tracks = $scope.getTracks().then(function (data) { 
     console.log('Getting tracks'); 
     return data; 
    }) 
    .catch(function (error) { 
     console.log(error); 
    }); 
    $scope.$broadcast('scroll.refreshComplete'); 
    } 

$scope.refresh()機能がアクションをリフレッシュするためにプルに発生します。

はここControllers.jsから関連するセクションです。この関数はfineと呼ばれますが、最初のconsole.log()の後で停止します。ここでは(他のloggings付き)コンソールからの抜粋です:最後の行の後

2016-04-07 14:30:38.419 HelloCordova[8269:377355] updateInfo() data: [object Object] 
2016-04-07 14:30:38.419 HelloCordova[8269:377355] Done updating 
2016-04-07 14:30:38.419 HelloCordova[8269:377355] getUser() data: [object Object] 
2016-04-07 14:30:38.420 HelloCordova[8269:377355] $scope.load() data: [object Object] 
2016-04-07 14:30:41.198 HelloCordova[8269:377355] Refresh Tracks Started 

、他には何も起こらないとアプリがハングを残しています。上記の行を無視して、彼らは以前の問題と関係がある。

私は何が起こっているのか分かりませんが、Spotifyからいくつかのトラックデータを取得することになっていますが、そのロジックはすべて呼び出されない$scope.getTracks()関数内から呼び出されます。私は何を間違えたのですか?

編集:ここServices.jsからSpotifyService.getTrack機能です:

SpotifyService.getTrackリターンの約束を想定し
getTrack: function(id, loved, from) { 
    var storedToken = window.localStorage.getItem('spotify-token'); 
    if (storedToken !== null) { 
     return trackInfo(id).then(function(data) { 
      return data; 
     }) 
     .catch(function(error) { 
      console.log(error); 
     }); 
    } else { 
     login(); 
    } 
    } 
+0

ここでは、トラックの先頭にあるキーをインデックスとして使用しています。 –

+0

私は 'SpotifyService.getTrack'が約束を返すものだと思います。 '$ scope.getTracks'は同期式です(あなたの配列を返す、約束ではありません)。 –

+0

もう少し明確にするために 'SpotifyService.getTrack'関数を追加します... –

答えて

1

は、$scope.getTracks機能は、約束の配列を返します。私はあなたが探していると思う、すべてのトラックが受信されたら$scope.tracksを割り当てています。これを試してみてください:

$q.all($scope.getTracks()).then(function (data) { 
    console.log('Getting tracks'); 
    $scope.tracks = data; 
}) 
.catch(function (error) { 
    console.log(error); 
}); 
+0

これはうまくいくと思います。 –