当前位置: 首页 > 面试题库 >

如何使所有AJAX调用顺序执行?

席安康
2023-03-14
问题内容

我使用jQuery。而且我不想在我的应用程序上进行并行AJAX调用,每个调用都必须等待上一个调用之后才能开始。如何执行呢?有帮手吗?

更新 如果我想知道XMLHttpRequest或jQuery.post的任何同步版本。但是顺序!=同步,我想要一个异步和顺序解决方案。


问题答案:

有比使用同步ajax调用更好的方法。jQuery
ajax返回一个延迟,因此您可以使用管道链接来确保每个ajax调用在下一次运行之前完成。这是一个工作示例,其中包含更深入的示例,您可以在jsfiddle上使用它。

// How to force async functions to execute sequentially 
// by using deferred pipe chaining.

// The master deferred.
var dfd = $.Deferred(),  // Master deferred
    dfdNext = dfd; // Next deferred in the chain
    x = 0, // Loop index
    values = [],

    // Simulates $.ajax, but with predictable behaviour.
    // You only need to understand that higher 'value' param 
    // will finish earlier.
    simulateAjax = function (value) {
        var dfdAjax = $.Deferred();

        setTimeout(
            function () {
                dfdAjax.resolve(value);
            },
            1000 - (value * 100)
        );

        return dfdAjax.promise();
    },

    // This would be a user function that makes an ajax request.
    // In normal code you'd be using $.ajax instead of simulateAjax.
    requestAjax = function (value) {
        return simulateAjax(value);
    };

// Start the pipe chain.  You should be able to do 
// this anywhere in the program, even
// at the end,and it should still give the same results.
dfd.resolve();

// Deferred pipe chaining.
// What you want to note here is that an new 
// ajax call will not start until the previous
// ajax call is completely finished.
for (x = 1; x <= 4; x++) {

    values.push(x);

    dfdNext = dfdNext.pipe(function () {
        var value = values.shift();
        return requestAjax(value).
            done(function(response) {
                // Process the response here.

            });

    });

}

有些人说他们不知道代码做什么。为了理解它,您首先需要了解javascript
promises。我敢肯定,诺言很快就会成为本地javascript语言功能,因此这应该给您学习的良好动力。



 类似资料:
  • 问题内容: 我有大量数据,并且想要调用缓慢但干净的方法,而不是调用带有第一个结果的副作用的快速方法。我对中间结果不感兴趣,所以我不想收集它们。 明显的解决方案是创建并行流,进行慢速调用,再次使流顺序进行,然后进行快速调用。问题是,所有代码都在单个线程中执行,没有实际的并行性。 示例代码: 如果我删除,代码将按预期执行,但是很明显,非并行操作将在多个线程中调用。 您能推荐一些有关这种行为的参考,或者

  • 问题内容: 我整天都在整理此问题,希望有人能帮助您确定我的问题。我已经使用Ajax在我的应用程序中创建了“异步进度回调”类型的功能。当我将功能剥离到测试应用程序中时,我得到了预期的结果。见下图: 所需功能 当我使用相同的代码将功能绑定到我的单页应用程序中时,出现了一种阻塞问题,其中所有请求仅在最后一个任务完成后才得到响应。在测试应用程序中,所有请求均会依次响应。服务器报告所有请求的状态(“待定”)

  • 问题内容: 我想以这种方式进行Ajax调用的堆栈:call(n-1)完成后,call(n)开始… 由于多种原因,我无法使用 async:false : 一些请求可能是 jsonp (最相关) 我还有其他一些可能同时起作用的ajax请求。 浏览器被阻止 我无法以这种方式链接我的请求: 因为请求的数量和参数是根据用户输入动态创建的。 一个小例子说明了我的问题。 您将看到服务器响应顺序是随机的,我要实现

  • 问题内容: 可以说我有一个简单的函数,像这样。 http://jsfiddle.net/AT5vt/ 是否可以使全局ajaxSuccess()函数在本地成功回调之前被调用?因为我想对结果进行全局检查,然后再由局部函数进行进一步处理。 问题答案: 使用默认的ajax发布而不是使用自定义发布处理程序: http://jsfiddle.net/AT5vt/1/ 并未将其放在jsfiddle中,因为从那里

  • 打扰一下。我还在学习令人惊叹的JQuery语言。我遇到了一个问题,读了很多书,但仍然一团糟。希望你能指导我解决问题。 我有三个函数,它们执行三个post调用。它们返回一个文本变量,我最近将其解析为JSON(如果可用)。 问题是所有这些功能都很有效。。。当然,它们是异步的。我需要: 按顺序执行,就像它们是同步的 除此之外,(这是我的挑战之一)函数a接收到一个param1,但在执行后,代码将param

  • 问题内容: 我有一个带有行的表格样式页面。每行都有一个复选框。我可以选中所有/很多复选框,然后单击“提交”,这是对每一行的Jquery ajax调用。 基本上,我为每一行都有一个表单,并且遍历所有选中的行并提交执行jquery ajax调用的表单。 所以我有一个按钮,它可以: 那么每一行都有: 该表格提交给processRow: 我想知道的是,通过这种方法,我可以判断出我所有的Ajax调用是否均已