使用javascript/jquery检查函数是否已完成其任务
我试图暂停一个函数,直到另一个函数完成它的任务。除了函数的完成,还有什么类似于.ajaxComplete()的吗 这段代码应该首先快速打印出“test”,然后再减速(如果愿意的话,可以减速)。随着循环中的数字变高,setTimeout变长,因此,它在循环进行时打印“较慢”。基本上,我需要循环暂停,直到函数打印出来 编辑-我更新了我的代码。“测试”只打印一次,其他情况不会发生使用javascript/jquery检查函数是否已完成其任务,javascript,jquery,Javascript,Jquery,我试图暂停一个函数,直到另一个函数完成它的任务。除了函数的完成,还有什么类似于.ajaxComplete()的吗 这段代码应该首先快速打印出“test”,然后再减速(如果愿意的话,可以减速)。随着循环中的数字变高,setTimeout变长,因此,它在循环进行时打印“较慢”。基本上,我需要循环暂停,直到函数打印出来 编辑-我更新了我的代码。“测试”只打印一次,其他情况不会发生 <html> <head> <script src="http://ajax.google
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<input type="button" value="Display alert box" onclick="docWrite()" />
<script>
var b = 0;
function docWrite() {
document.write("test");
timeMsg();
}
function timeMsg() {
b += 250;
if (b < 5000) { //check the limit
setTimeout("docWrite()", b - 250); //substract 250 (because we already added 250 before the first print
}
}
</script>
</body>
</html>
var b=0;
函数docWrite(){
文件。编写(“测试”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(“docWrite()”,b-250);//减250(因为我们在第一次打印之前已经添加了250
}
}
我认为最好让超时函数启动一个新的超时函数
这将解决您的问题,并完全摆脱for循环
<script>
var b = 0;
function docWrite() {
$('body').append("test");
timeMsg();
}
function timeMsg() {
b += 250;
if (b < 5000) { //check the limit
setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print
}
}
</script>
var b=0;
函数docWrite(){
$('body')。追加(“test”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}
修改您自己的脚本我最终会得到以下结果:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<input type="button" value="Display alert box" onclick="timeMsg()" />
<script>
var b = 0;
function docWrite() {
$("body").append("test");
timeMsg();
}
function timeMsg() {
b += 250;
if (b < 5000) { //check the limit
setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print
}
}
</script>
</body>
</html>
var b=0;
函数docWrite(){
$(“正文”)。附加(“测试”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}
我认为最好让超时函数启动一个新的超时函数
这将解决您的问题,并完全摆脱for循环
<script>
var b = 0;
function docWrite() {
$('body').append("test");
timeMsg();
}
function timeMsg() {
b += 250;
if (b < 5000) { //check the limit
setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print
}
}
</script>
var b=0;
函数docWrite(){
$('body')。追加(“test”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}
修改您自己的脚本我最终会得到以下结果:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
</head>
<body>
<input type="button" value="Display alert box" onclick="timeMsg()" />
<script>
var b = 0;
function docWrite() {
$("body").append("test");
timeMsg();
}
function timeMsg() {
b += 250;
if (b < 5000) { //check the limit
setTimeout(docWrite, b - 250); //substract 250 (because we already added 250 before the first print
}
}
</script>
</body>
</html>
var b=0;
函数docWrite(){
$(“正文”)。附加(“测试”);
timeMsg();
}
函数timeMsg(){
b+=250;
如果(b<5000){//检查限值
setTimeout(docWrite,b-250);//减去250(因为我们在第一次打印之前已经添加了250
}
}
您必须将回调添加到docWrite()
。通过向其传递函数,使其运行某些操作(或之后要执行的操作)
function docWrite(callback) {
document.write('test');
// something like
callback();
}
然后你可以这样构造它:
var b = 0;
function timeMsg(){
var t = setTimeout(function () {
docWrite(function () {
// what to do after this finishes
if (b > 5000) { return; }
b += 250;
timeMsg();
})
}, b);
}
您必须将回调添加到
docWrite()
。通过向其传递函数,使其运行某些操作(或之后要执行的操作)
function docWrite(callback) {
document.write('test');
// something like
callback();
}
然后你可以这样构造它:
var b = 0;
function timeMsg(){
var t = setTimeout(function () {
docWrite(function () {
// what to do after this finishes
if (b > 5000) { return; }
b += 250;
timeMsg();
})
}, b);
}
以下功能可用于完成您的任务:
function repeat(action, initial, slowdown, count, callback) {
function next(time) {
window.setTimeout(function() {
if (count--) {
action();
next(time+slowdown);
}
else
callback();
}, time);
}
next(initial);
}
您可以按如下方式使用它:
repeat(docWrite, 0, 250, 5000/250, function() {
$("body").append("done");
});
function docWrite(){
$("body").append("test");
}
请注意,如果操作
回调(docWrite
)执行异步调用,例如动画本身,您希望在启动下一个计时器之前等待完成,那么它会变得有点复杂。如果是这种情况,请告诉我
以下功能可用于完成任务:
function repeat(action, initial, slowdown, count, callback) {
function next(time) {
window.setTimeout(function() {
if (count--) {
action();
next(time+slowdown);
}
else
callback();
}, time);
}
next(initial);
}
您可以按如下方式使用它:
repeat(docWrite, 0, 250, 5000/250, function() {
$("body").append("done");
});
function docWrite(){
$("body").append("test");
}
请注意,如果操作
回调(docWrite
)执行异步调用,例如动画本身,您希望在启动下一个计时器之前等待完成,那么它会变得有点复杂。如果是这种情况,请告诉我
您应该避免使用全局变量。这会使您的代码更难理解。
//在docWrite完成之前暂停循环的操作不可能以您希望的方式进行。
除了极少数例外,JS中不能有阻塞调用。您需要使用回调函数来设置在同步操作已完成。//在docWrite完成之前暂停循环的某项操作
——这将冻结浏览器,并且inacceptable@zerkms~z~不太可能;我可以想出一些你想要阻止的原因。不过,我听到你说的,一般来说是这样。哦,你可能会想检查你的for循环语法。这是一个很好的例子无限循环。您应该避免使用全局变量。这会使您的代码更难理解。//在docWrite完成之前暂停循环的操作不可能以您希望的方式进行。
。除极少数例外情况外,JS中不能有阻塞调用。您需要使用回调函数来设置需要运行的操作呃,异步操作已完成。//在docWrite完成之前暂停循环的某些操作。
——这将冻结浏览器并停止inacceptable@zerkms~z~不太可能;我能想到一些你想要阻止的原因。不过,我听到你说的,一般来说是这样。哦,你可能会想检查你的for循环语法。这真是一个麻烦一个无限循环。看这一点是有道理的,但我无法让它工作。我将用整个html页面更新上面的代码setTimeout(“docWrite()”,b-250)应该替换为setTimeout(docWrite,b-250)。此外,您还忘了“var b=0;”:)。让您的脚本在chrome中使用这些修复程序。我在firefox和IE中尝试过,但都没有成功。只显示一次“测试”。在setTimeout中,如果我将docWrite更改为docWrite(),所有20个“测试”都会立即显示。而不是document.write(“测试”)使用$('body')。append(“测试”);document.write将替换整个文档。是的,timeMsg()函数在设置超时后结束。当超时发生时,系统将调用docwrite()函数。(换句话说,它不是递归的)。从这个角度看,这是有道理的,但我无法让它工作。我将用整个html页面更新上面的代码