JavaScript setTimeout() 实际上并没有执行它的函数
JavaScript setTimeout() not actually executing it's function?
我有一个JavaScript函数,它遍历一个选中的复选框列表,并为每个复选框上传一个视频文件。 在开始上传过程之前,我正在尝试确保视频已转码为较小的格式。 我用来跟踪已完成转码过程的数组视频中的索引。 在开始给定视频的上传过程之前,我检查以确保计数器为>= id。 如果计数器太低(文件尚未转码),我使用 setTimout() 再次调用 uploadVideos 函数。 它似乎再也不会调用 uploadVideos 函数,因为我再也没有看到警报弹出。
我怎样才能让它工作?
function uploadVideos(id, videos, selected, boxes) {
var status = document.getElementById('currentUploadStatus');
// need to deal with element an array
var fields = videos[id].split(":", 2);
var playlist = document.getElementById('playlist');
var dataString = 'videoId='+ fields[0] + '&playlist=' + escape(playlist.value);
// need to determine the maxTranscodedId
var counter = document.getElementById('counter');
alert('counter: ' + counter.innerHTML + " id: " + id);
if (counter.innerHTML >= id) {
id++;
status.innerHTML = "<b class='status'>Uploading Bout #" + fields[1] + " (" + id + " of " + videos.length + ")</b>";
$.ajax({
type: "GET",
url: "floUpload.php",
data: dataString,
success: function(txt) {
if (txt != 'Success') {
alert(':' + txt + ':');
}
if (id < videos.length) {
uploadVideos(id, videos, selected, boxes);
} else {
//re-enable the start button
var startButton = document.getElementById('start');
startButton.disabled = false;
status.innerHTML = "<b class='status'>Upload Complete</b>";
alert('Upload Completed');
}
//deselect the checkbox
if (boxes == 1 ) {
document.videos.video.checked = false;
document.videos.video.style.display = 'none';
} else {
document.videos.video[selected[id-1]].checked = false;
document.videos.video[selected[id-1]].style.display = 'none';
}
},
async: true
});
} else {
// timer call myself the same way I was called
status.innerHTML = "<b class='status'>Upload waiting for trancode.</b>";
var t=setTimeout("uploadVideos(id, videos, selected, boxes)",3000);
//var t=setTimeout("alert('waking')",3000);
}
}
这是JS初学者的常见错误。 setTimeout
允许以下两种第一参数之一:a)文本,您可以在其中将要评估的JS代码置于范围之外(因此引用的变量可能未定义),不太有用。b) 功能,例如我为此提出的修复程序,是替换以下行:
setTimeout("uploadVideos(id, videos, selected, boxes)",3000);
跟:
setTimeout(function(){
uploadVideos(id, videos, selected, boxes);
},3000);
如您所见,我将函数调用包装在另一个匿名函数中。为什么?仅仅因为我需要传递参数,否则我只会调用它,而不是作为参数传递。
相关文章:
- 如何做到这一点,使代码在不传递条件后执行函数
- javascript自执行函数-不同的语法
- JavaScript:只有当数组中的所有项都为true时才执行函数
- iFrame url更改时执行函数
- 为什么AngularJS在每个摘要循环上都执行函数
- 如何使用setInterval执行函数
- 当*ngFor以角度2结束时执行函数
- Ajax调用完成后如何执行函数
- 在显示引导弹出窗口之前执行函数
- 从自执行函数返回函数的Javascript性能命中率
- 在操作完成时执行函数
- jquery/js中的自执行函数
- 如何仅在完成对gap.client.youtube的请求.execute后执行函数
- 构造函数函数中的自执行函数的OO上下文/范围
- Javascript未使用=运算符执行函数
- AngularJS:如何按照预定义的顺序执行函数
- 在不使用隔离作用域的情况下执行函数的角度指令
- 如何在页面加载后执行函数是在 AngularJS 中完成的
- 完成页面加载后执行函数
- 如何在完成完全执行函数后触发循环