我有以下方法:
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;
变量我是全球性的,我仍然无法联系到他们。我该怎么解决呢?
答案 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);
}