如何让代码在调用Ajax等异步调用时等待

How to make code wait while calling asynchronous calls like Ajax

本文关键字:调用 异步 等待 Ajax 代码      更新时间:2023-09-26

我正在寻找这样的东西

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');
}

我试过了吗?

1

Jquery.when ()

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

之后运行。

2。setTimeOut()带有全局标志

我很有信心这将工作。

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);
    }
}​

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

我想要的结果是这样的

Pass1
Pass2

不能做任何摆弄,因为它需要AJAX调用

EDIT:正如许多人建议回调…我知道他们…但是somewait()旁边的代码仍然会被执行…我希望浏览器完全停止执行代码旁边的somewait(),直到ajax调用..这也可能是一个不好的做法,但值得知道和尝试,如果可能的话…

使用回调。这样的东西应该基于您的示例代码工作。

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不能工作?除非我误解了什么,否则这可能对你有用。

/* 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请求中设置属性asyncfalse,以使它们阻塞。这将挂起浏览器,直到请求完成。

请注意,我不建议这样做,我仍然认为你应该在基于事件的工作流中修复你的代码,而不是依赖于它

真正的程序员使用信号量。

将变量设置为0。在每次AJAX调用之前增加它。在每个成功处理程序中递减它,并测试0

如果您需要等待ajax调用完成,那么您所需要做的就是同步调用。