103

我正在寻找这样的东西

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 调用..这也可能是一个不好的做法但如果可能的话,值得了解和尝试......

4

4 回答 4

61

使用回调。像这样的东西应该根据您的示例代码起作用。

function someFunc() {

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

}

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

这将Pass1立即打印(假设 ajax 请求至少需要几微秒),然后Pass2onAjaxSuccess执行时打印。

于 2012-12-25T14:31:25.873 回答
20

为什么它不适合你使用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');
  });
};​

在这里看到它


更新

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

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

于 2012-12-25T14:37:33.037 回答
8

真正的程序员使用信号量来做到这一点。

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

于 2012-12-25T14:24:07.370 回答
0

如果您需要等到 ajax 调用完成,您只需要同步进行调用。

于 2012-12-25T14:38:09.700 回答