Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待函数完成后再重新启动_Javascript_Jquery_Ajax_Settimeout - Fatal编程技术网

Javascript 等待函数完成后再重新启动

Javascript 等待函数完成后再重新启动,javascript,jquery,ajax,settimeout,Javascript,Jquery,Ajax,Settimeout,早上好 我试图在用户每次按下按钮时调用相同的函数。下面是目前发生的情况 用户单击按钮->调用函数->函数需要1000毫秒以上的时间才能完成(由于jQuery和AJAX调用的动画) 我希望每次用户按下按钮时,它都会将函数添加到队列中,等待上一个调用完成,然后启动 这可能吗 对不起,如果我的解释有点混乱的话 谢谢Matthew,我最近不得不在自己的应用程序中这样做。我给您的最好建议是(假设您已经在JavaScript函数中进行了AJAX调用)将回调函数参数传递到JavaScript函数中。然后,在A

早上好

我试图在用户每次按下按钮时调用相同的函数。下面是目前发生的情况

用户单击按钮->调用函数->函数需要1000毫秒以上的时间才能完成(由于jQuery和AJAX调用的动画)

我希望每次用户按下按钮时,它都会将函数添加到队列中,等待上一个调用完成,然后启动

这可能吗

对不起,如果我的解释有点混乱的话


谢谢Matthew,我最近不得不在自己的应用程序中这样做。我给您的最好建议是(假设您已经在JavaScript函数中进行了AJAX调用)将回调函数参数传递到JavaScript函数中。然后,在AJAX调用的
success
部分,调用回调函数

示例:

// In HTML <script> tags.
$(document).ready(function () {
    $("button#queue").click(function() {
        GetMembers(GetGroups(), MemberCallback));
    });
});

function GetMembers(userId, callback) {
    $.ajax({
        //Initialized AJAX properties
        url: "/My/Project/Ajax/Page.extension",
        data: "{ 'groupId':'" + groupId + "'}",
        success: function (result) {
            callback(result.d);
        }
    });
}

function MemberCallback(members) {
    // Do your thing here.
}
//在HTML标记中。
$(文档).ready(函数(){
$(“按钮队列”)。单击(函数(){
GetMembers(GetGroups(),MemberCallback));
});
});
函数GetMembers(userId,回调){
$.ajax({
//初始化的AJAX属性
url:“/My/Project/Ajax/Page.extension”,
数据:“{'groupId':'”+groupId+“}”,
成功:功能(结果){
回调(结果d);
}
});
}
函数MemberCallback(成员){
//在这里做你的事。
}

您可以在制作动画的函数中添加一个回调函数,一旦动画完成回调,就会调用回调函数,这样您就可以随心所欲了

下面是jquery文档中的一个示例:

$('#clickme').click(function() {
  $('#book').animate({
    opacity: 0.25,
    left: '+=50',
    height: 'toggle'
  }, 5000, function() {
    // Put your code here, so it will be executed once the animation completes
  });
});

附言:早上好?快午夜了;D

您可以跟踪全局队列/数组,每次用户按下按钮时,您都会将其添加到队列中,然后您需要在函数中进行回调(例如在jQuery的
success
回调中)这将检查队列并调用队列上的下一个函数。

因为函数是可以存储属性的对象。您可以让函数在每次调用它时(按下按钮)在其自身上增加一个“队列”属性,然后在函数执行结束时,检查其自身的队列属性是否>0,如果是,则将队列属性减一,然后使用
setTimeout

在单击按钮时禁用该按钮。ajax例程完成后启用它。

是否要将动画和ajax正确地排入队列?无需全局命名空间:只需向使用它的对象添加一个属性。:D这里也是午夜时分。顺便说一句,我想他事先不知道(当动画完成时)按钮是否再次按下。最好的方法是调用setTimeout。否则,这将导致堆栈溢出。;-)+1@draeton好点子!当/如果函数在结束时调用自身,则应在setTimeout中完成,延迟为零。@draeton:事实上,这还有一个好处,即浏览器的渲染引擎可以执行某些操作(并避免出现“脚本Y似乎忙了一段时间。是否杀死它?”)