Javascript承诺并更新变量

Javascript Promises and updating variables

本文关键字:变量 更新 承诺 Javascript      更新时间:2024-03-01

我一直在想办法登录Spotify,并从我的Ionic应用程序中的服务中执行大多数数据检索,但一个承诺导致代码完全暂停。

以下是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()函数发生在拉取刷新操作上。此函数被称为fine,但它在第一个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()函数中调用的。我做错了什么?

编辑:以下是Services.js:中的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();
    }
  }

假设SpotifyService.getTrack返回一个promise,则$scope.getTracks函数返回一个promise数组。我想你想要的是,一旦收到所有曲目,就分配$scope.tracks。试试这个:

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