关于javascript:如何在调用Ajax之类的异步调用时使代码等待

How to make code wait while calling asynchronous calls like Ajax

本问题已经有最佳答案,请猛点这里访问。

我在找像这样的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
function someFunc() {

callAjaxfunc(); //may have multiple ajax calls in this function
someWait(); // some code which waits until async calls complete
console.log('Pass2');

}

function callAjaxfunc() {
  //All ajax calls called here
  console.log('Pass1');

}

我试过什么?

一时,()

尝试过使用它。它工作得很好。但不是我想要的方式。$.when将等待,但$.when()旁边的代码运行时没有等待。do callback中的代码只在ajax调用后运行。

2。带有全局标志的setTimeout()。

我很有信心这会奏效。我试着跟在后面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GlobalFlag = false;

function someFunc()    
    callAjaxfunc(); //may have multiple ajax calls in this function
    setTimeOut(waitFunc, 100); // some  which waits until async calls complete
    console.log('Pass2');
}

function callAjaxfunc() {
    //All ajax calls called here
    onAjaxSuccess: function() {
        GlobalFlag = true;
    };
    console.log('Pass1');    
}

function waitFunc() {
    if (!GlobalFlag) {
        setTimeOut(waitFunc, 100);
    }
}?

仍然无法得到想要的结果。我在这里做错什么了吗?不是这样吗?

我想要的结果应该是这样的

1
2
Pass1
Pass2

由于需要Ajax调用,无法进行任何操作

编辑:很多人都在建议回调……我知道它们……但仍然会执行somewait()旁边的代码……我希望浏览器在Ajax调用之前完全停止执行somewait()旁边的代码……同样,这可能是一个糟糕的做法,但值得知道并尽可能尝试……


使用回调。类似这样的代码应该基于示例代码工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function someFunc() {

callAjaxfunc(function() {
    console.log('Pass2');
});

}

function callAjaxfunc(callback) {
    //All ajax calls called here
    onAjaxSuccess: function() {
        callback();
    };
    console.log('Pass1');    
}

这将立即打印Pass1(假设Ajax请求至少需要几微秒),然后在执行onAjaxSuccess时打印Pass2


为什么你不使用Deferred Objects呢?除非我误解了一些事情,否则这对你可能有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* AJAX success handler */
var echo = function() {
    console.log('Pass1');
};

var pass = function() {
  $.when(
    /* AJAX requests */
    $.post("/echo/json/", { delay: 1 }, echo),
    $.post("/echo/json/", { delay: 2 }, echo),
    $.post("/echo/json/", { delay: 3 }, echo)
  ).then(function() {
    /* Run after all AJAX */
    console.log('Pass2');
  });
};?

看这儿。

更新

根据您的输入,您最快的选择似乎是使用同步请求。您可以在您的$.ajax请求中将属性async设置为false,使其阻塞。这将挂起您的浏览器,直到请求完成。

注意,我不建议这样做,我仍然认为您应该在基于事件的工作流中修复代码,以避免依赖它。


真正的程序员用信号量来实现它。

将变量设置为0。在每次调用Ajax之前递增。在每个成功处理程序中递减,并测试0。如果是,你就完了。


如果您需要等待Ajax调用完成,那么您所需要的就是同步地进行调用。