Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.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
Jquery 可能会暂停直到ajax请求完成,还是停止ajax请求?_Jquery_Ajax_Drop Down Menu - Fatal编程技术网

Jquery 可能会暂停直到ajax请求完成,还是停止ajax请求?

Jquery 可能会暂停直到ajax请求完成,还是停止ajax请求?,jquery,ajax,drop-down-menu,Jquery,Ajax,Drop Down Menu,我有一个在selectbox更改事件中调用的函数。在我拥有的函数中: 代码: 这就像预期的一样,但有点麻烦。例如,如果这些ajax请求需要一些时间才能完成,并且如果我在这些ajax请求当前运行时再次调用该函数,我将在接收第二个请求的数据的同时接收第一个数据。现在两个请求都将填充选择框。这种情况并不经常发生,当它发生时,它会变得有点烦人。我不太清楚如何回避这个问题。有什么提示/想法可以阻止这种情况发生吗?我想在请求完成之前禁用selectbox,但我不确定如何实现,因为我使用的是来自的select

我有一个在selectbox更改事件中调用的函数。在我拥有的函数中:
代码:

这就像预期的一样,但有点麻烦。例如,如果这些ajax请求需要一些时间才能完成,并且如果我在这些ajax请求当前运行时再次调用该函数,我将在接收第二个请求的数据的同时接收第一个数据。现在两个请求都将填充选择框。这种情况并不经常发生,当它发生时,它会变得有点烦人。我不太清楚如何回避这个问题。有什么提示/想法可以阻止这种情况发生吗?我想在请求完成之前禁用selectbox,但我不确定如何实现,因为我使用的是来自的selectbox操作。我查看了插件的代码,发现插件使用了$.getJSON

已编辑插件getJSON代码:

$.fn.ajaxAddOption = function(url, params, select, fn, args)
{
    var ajaxRunning = false;

    $(window).ajaxStart(function () {
      ajaxRunning = true;
    }).ajaxStop(function () {
      ajaxRunning = false;
    });

    if(typeof(url) != "string") return this;
    if(typeof(params) != "object") params = {};
    if(typeof(select) != "boolean") select = true;
    this.each(
        function()
        {
            var el = this;
            if (!ajaxRunning) {

                $.getJSON(url,
                    params,
                    function(r)
                    {
                        $(el).addOption(r, select);
                        if(typeof fn == "function")
                        {
                            if(typeof args == "object")
                            {
                                fn.apply(el, args);
                            } 
                            else
                            {
                                fn.call(el);
                            }
                        }
                    }
                );
            }
        }
    );
    return this;
};

编辑插件代码并不是完全超出我的范围;但是,我不想由于缺乏对内部工作原理的了解而使插件无法使用。

您正在处理AJAX的一个更精细的怪癖-并发性。你有两个选择。您可以将请求的async设置为false,但我个人会像瘟疫一样避免这种情况。您的最佳选择(IMHO)是基于ajaxStart和ajaxStop设置事件,并使用一个状态变量防止触发其他请求。类似这样的东西(尽管它需要根据您现有的代码进行调整)

这将创建一个变量,您可以使用以下内容控制请求:

$('.mySelect').change(function () {
  if (!ajaxRunning) {
    $.getJSON(); // Your complete code here.
  }
});

这将设置它,以便选择列表的更改处理程序仅在当前没有一个处理的情况下启动其AJAX调用。

您正在处理AJAX的一个更精细的怪癖—并发性。你有两个选择。您可以将请求的async设置为false,但我个人会像瘟疫一样避免这种情况。您的最佳选择(IMHO)是基于ajaxStart和ajaxStop设置事件,并使用一个状态变量防止触发其他请求。类似这样的东西(尽管它需要根据您现有的代码进行调整)

这将创建一个变量,您可以使用以下内容控制请求:

$('.mySelect').change(function () {
  if (!ajaxRunning) {
    $.getJSON(); // Your complete code here.
  }
});

这将设置它,以便选择列表的更改处理程序仅在当前没有一个处理的情况下触发其AJAX调用。

您需要中止AJAX调用

ajax = $.getJSON(//..params);

ajax.abort();

您需要中止ajax调用

ajax = $.getJSON(//..params);

ajax.abort();

两个代码示例都很棒,我感谢你们两位对我的帮助。我确实找到了一个很棒的jquery插件,它目前可以完美地满足我的需求。链接:ajaxq将每个ajax请求存储到一个队列中,并在请求完成时按顺序激发它们。

这两个代码示例都很棒,我感谢你们两位对我的帮助。我确实找到了一个很棒的jquery插件,它目前可以完美地满足我的需求。链接:ajaxq将每个ajax请求存储到一个队列中,并在请求完成时按顺序激发它们。

我喜欢您的方法和解释中的细节。然而,在修改插件的代码后,我并没有像预期的那样工作。我对插件代码的修改很可能有错误。我将用完整的代码编辑我的原始问题我喜欢你的解释方法和细节。然而,在修改插件的代码后,我并没有像预期的那样工作。我对插件代码的修改很可能有错误。我将用完整的代码编辑我的原始问题我觉得这对我很有效。我喜欢这种简单而直接的方法:-)在进一步测试您的示例之后,我仍然遇到了并发性问题。abort()按预期工作,但在当前激发的请求上。我在google上做了进一步的阅读和搜索,发现了这个很棒的Jquery AJAX插件,它将每个请求存储在一个队列中,并在下一个请求完成之前触发下一个请求。林克:哇,太酷了。事实上,我写了一些非常类似的东西,这是我发现关于堕胎的地方。无论如何,谢谢你的留言,祝你一切顺利。这对我很有效。我喜欢这种简单而直接的方法:-)在进一步测试您的示例之后,我仍然遇到了并发性问题。abort()按预期工作,但在当前激发的请求上。我在google上做了进一步的阅读和搜索,发现了这个很棒的Jquery AJAX插件,它将每个请求存储在一个队列中,并在下一个请求完成之前触发下一个请求。林克:哇,太酷了。事实上,我写了一些非常类似的东西,这是我发现关于堕胎的地方。无论如何,谢谢你的留言,祝你一切顺利。