无法在服务结果中获取 for 循环循环的迭代计数 -> 然后

Cannot get iteration count of for loop cycle inside of the service result -> then

我有以下方法:

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;

变量 i 是全局的,我仍然无法访问它们。请问我该如何解决?

如果你创建一个局部变量 var that=i 是否有效?就在您调用 promise 之前,然后尝试将 "that" 放入 promise return?

否则试试这个:

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

这不是因为 i 不可访问,而是因为 i 的 运行 超出了限制,因为 loadMedia 是异步的并且 [= 的值回调中的 11=] 将变为 $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,这将导致您的循环根本不 运行。