2016-04-24 16 views
0

私はJavascriptの約束を理解するように近づいていると思いますが、forループに関する新しい問題があります。私は別のSpotify URIをフィードする関数を持っています.2番目のメソッドはトラック情報を取得してから、配列に含まれるように戻ります。これまでのところ、私はBluebirdライブラリを使用するソリューションを見つけていましたが、AngularJSを使用する場合、統合はかなり簡単ではありません。

私は基本的にデータに解決されない約束を取り戻しています。

これは、サービスで第二の機能にデータを送り、私のコントローラ内の関数である:他の側に

$scope.getUserRecent = function() { 
    var id = window.localStorage.getItem('id'); 
    return UserService.getTracks(id).then(function (data) { 
     var tracks = {}, i; 

     console.log(data); 

     for (i = 0; i < data.length; i++) { 
      tracks[i] = SpotifyService.getTrack(i, data[i].uri, data[i].loved, data[i].from); 
      console.log(i + ": " + tracks[i]); 
     } 
     console.log(tracks); 

     return tracks; 
    }) 
    .catch(function (error){ 
     console.log(error); 
    }); 
}; 

機能がダウンしてデータを引っ張って、絶対に正常に動作し、それが必要として、それを返します。しかし、約束は解決されていません。これをどうすれば解決できますか?

編集:$scope.getUserRecent()からアクセス:

$scope.refresh = function() { 
    $q.all($scope.getUserRecent()).then(function (data) { 
     console.log(data); 
     $scope.tracks = data; 
    }) 
    .catch(function (error) { 
     console.log(error); 
    }); 

    $scope.$broadcast('scroll.refreshComplete'); 
}; 

$scope.$on('$ionicView.enter', function (e) { 
    $scope.refresh(); 
}); 

UserService.getTracks(id)リターン:

[Object, Object] 
    0:Object 
     from:"string" 
     id:1 
     loved:true 
     sharerId:1 
     uri:"6mNMp0g3zkg1K7uBpn07zl" 
     __proto__:Object 
    1:Object 
     from:"string" 
     id:2 
     loved:true 
     sharerId:1 
     uri:"14WWzenpaEgQZlqPq2nk4v" 
     __proto__:Object 
    length:2 
    __proto__:Array[0] 
+0

'UserService.getTracks()'が返すものを示してください。 'SpotifyService.getTrack()'は非同期になり、 'tracks'オブジェクトのプロパティも決して設定しないことに注意してください。また、 'getUserRecent()'の使い方が分かりません – charlietfl

+0

Angularには '$ q.all'があり、bluebirdには' Promise.all'があります。 – Bergi

+0

@charlietflはあなたのためにいくつかの詳細を追加しました。 –

答えて

0

あなたが約束を解決する必要があるとして、消費者の機能$scope.refreshを使用するために、その後、return a new (different) one

$ scope.refresh:

あなたと同じです。

$ scope.getUserRecent:

function() { 
    var id = window.localStorage.getItem('id'); 
    return new Promise(function(resolve, reject) { 

    UserService 
     .getTracks(id) 
     .then(function (data) { 
     var tracks = {}, i; 

     console.log(data); 

     for (i = 0; i < data.length; i++) { 
      tracks[i] = SpotifyService.getTrack(i, data[i].uri, data[i].loved, data[i].from); 
      console.log(i + ": " + tracks[i]); 
     } 

     console.log(tracks); 

     resolve(tracks); 

     }) 
     .catch(function (error){ 
      console.error(error); 
      reject(error); 
     }); 
    }; 

オリジナルOPの$scope.getUserRecentのいくつかの観察:

  • then関数は戻り値のみundefinedあなたが出力この方法を持っていないことに注意してください。
  • return tracks;thenステートメント内に記述されているステートメントは、呼び出し側の環境、つまり$scope.getUserRecentにのみデータを返し、実際の目標である外部実行時環境は返しません。