无法获得服务结果内部的循环周期的迭代计数 - >然后

时间:2015-01-05 21:56:23

标签: angularjs for-loop service global-variables

我有以下方法:

var i;
$scope.playAllSelectedSounds = function() {
            try {

                for( i; i < $scope.selectedSounds.length; i++) {
                    var fileName = $scope.selectedSounds[i].file;
                    var volume = $scope.selectedSounds[i].defaultVolume;
                    var filePath  = "sounds/" +fileName+".mp3";
                    console.log(fileName);
                    MediaSrv.loadMedia(filePath).then(function(media){
                        console.log(media);
                        // !!!!!!!!!!!  HERE I CANNOT GET value of the i VARIABLE
                        $scope.selectedSounds[i].state = 1;
                        // !!!!!!!!!!!  HERE I CANNOT GET value of the i VARIABLE
                        $scope.selectedSounds[i].mediaInstance = media;
                        media.play();
                        media.setVolume(volume);
                    });

                }
            } catch(e) {
                alert(JSON.stringify(e));
                console.log(e);
                $scope.showAlert("Error", "Error during the playing item");
            }
        };

问题在于服务内部:

                MediaSrv.loadMedia(filePath).then(function(media){

我无法获得我需要设置的循环循环的数字o:

                $scope.selectedSounds[i].state = 1;

变量是全球性的,我仍然无法联系到他们。我该怎么解决呢?

2 个答案:

答案 0 :(得分:2)

这不是因为i无法访问,而是因为i已超出其限制,因为loadMedia是异步的并且回调中的值为i将成为$scope.selectedSounds.length,因为for循环在调用回调之前就已经用完了。

您可以通过使用表示当前项的闭包变量来解决此问题:您可以使用angular.forEach本身,并且您不需要担心访问正确的索引。相反,只需修改可用作forEach求值函数的第一个参数的对象本身。

      angular.forEach($scope.selectedSounds, function loadMedia(selectedSound, idx){
           var fileName = selectedSound.file;
            var volume = selectedSound.defaultVolume;
            var filePath  = "sounds/" +fileName+".mp3";

            MediaSrv.loadMedia(filePath).then(function(media){
                selectedSound.state = 1;
                selectedSound.mediaInstance = media;
                media.play();
                media.setVolume(volume);
            });

     });

你忘了在你的情况下初始化i,这将导致你的循环根本不运行。

答案 1 :(得分:0)

如果你创建一个局部变量var = i,它是否有效;在您致电承诺之前,然后尝试获得&#34;那个&#34;在承诺内回归?

否则试试这个:

 for (var i in superarray){
    (function(j) {
        MyService.get(superarray[j].externalID).then(function(r) {
            console.debug(j);
        });
    })(i);
}