提问者:小点点

如何使代码在调用类似Ajax的异步调用时等待[重复]


我在找这样的东西

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调用,所以不能做任何小动作

编辑:很多人都建议回调。。。我知道。。。但是someWait()旁边的代码仍然会被执行。。。我希望浏览器完全停止执行someWait()旁边的代码,直到ajax调用。。。而且这可能是一个不好的实践,但是如果可能的话值得了解和尝试。。。


共3个答案

匿名用户

使用回调。根据您的示例代码,类似的东西应该可以工作。

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请求中将属性async设置为false,以阻止它们。这将挂起您的浏览器,直到请求完成。

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

匿名用户

真正的程序员用信号量来做这件事。

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

相关问题