2016-04-07 4 views
0

Я уже возился с возможностью входа в Spotify и выполнял самый извлечение данных из службы в моем приложении Ionic, но обещание полностью приостанавливает выполнение кода.Javascript Promises and update variables

Вот соответствующий раздел из Controllers.js:

$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() функция происходит на рывок, чтобы обновить действие. Эта функция называется штрафом, но она останавливается после первого console.log(). Вот выдержка из консоли (с другой вырубкой):

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(), которая никогда не называется. Что я сделал не так?

Edit: Вот SpotifyService.getTrack функция от Services.js:

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

Предполагая, что SpotifyService.getTrack возвращает обещание, функция $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

Да, я думаю, это должно сработать. –