无法在服务结果中获取 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
,这将导致您的循环根本不 运行。
我有以下方法:
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
,这将导致您的循环根本不 运行。