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

Javascript 如何在调用Ajax等异步调用时让代码等待,javascript,jquery,Javascript,Jquery,我在找这样的东西 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 conso

我在找这样的东西

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

}
Pass1
Pass2
我试过什么?

1 Jquery.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);
    }
}​
仍然无法得到想要的结果。我做错什么了吗?不是这样吗

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

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

}
Pass1
Pass2
由于需要AJAX调用,因此无法进行任何处理


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

真正的程序员使用信号量


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

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

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

为什么它不适合您使用?除非我误解了什么,否则这可能对你有用

/* 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
请求中将属性设置为
false
,使其阻塞。这将挂起您的浏览器,直到请求完成



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

< P>如果您需要等到Ajax调用完成,那么您需要的是同步调用。 仅供参考,支持ajax测试。您不能将
someWait
之后的代码移到
内部,然后
回调吗?使用ajax callUsing回调函数(
$。当
时)这是唯一合理的方法…我知道回调…这是最基本的方法…但在这里我想停止浏览器做任何事情…直到Ajax调用完成。@Fabriciomatté..如何添加Ajax调用???JS中的错误做法。你能解释一下为什么在我们需要使调用同步的情况下,进行同步调用是一种错误的做法吗。拜托,尤其是在AJAX的情况下,当他们试图完成时,你会冻结整个浏览器。JS在事件循环中运行。您不想阻止不相关的代码。@在某些情况下,Trevor必须停止所有操作,直到执行某个操作或达到超时,本文的原始问题是调用之间存在某种同步。我不知道这个案例的全部情况,但我知道在每一个案例中都必须重新考虑“上帝的实践”,以获得最佳结果。存在正常化,但有时进行某种去正常化是有益的。我们可以自由作出自己的决定。对不起,我的英语很差,圣诞快乐。@Trevor…正如Mario所说,我的问题是我使用的是一个框架(内部框架)…在加载时,调用应该启动,浏览器应该等到Ajax调用完成。我知道回调。这是基本的方法…但在这里我想停止浏览器做任何事情。直到Ajax调用完成。@CodeJack,我认为这在javascript中是不可能的。你到底想通过这样做来实现什么,而这是不能通过这种方式实现的?(即,将代码移动到回调中)。问题是我正在使用某个专有框架。有一个加载函数,页面开始加载,在页面加载之前,我需要获取数据,唯一可以覆盖的函数是加载函数……那么,在调用框架之前加载数据?试图使js块成为一个坏主意。从技术上讲,使用同步请求是可能的,但这是一个可怕的想法,永远不应该使用。可能存在回调不适当的情况,例如:
webview.clearData({since:0},clearDataType,function(){…//重新创建新的webview})将造成资源占用(chrome将创建本地存储的新副本,直到旧的副本从内部回调中释放出来,这是永远不会发生的。我尝试使用“when”…但我想要的方式是,我希望浏览器在Ajax调用完成之前停止做任何事情…基本上,这些代码是在加载期间…@CodeJack,很抱歉告诉你,但浏览器不应该这样做。)Don’不要等,你应该wait@CodeJack,如果您仍然希望在要进行阻塞的AJAX调用中将其设置为
false
,那么就可以使用属性将
async
设置为
false
…谢谢..让我检查一下..谢谢..@CodeJack,它工作得更好吗?信号量在编程语言中可用,而不是在Ja中vaScript…信号量(如关键部分)是允许线程/进程之间安全共享资源的技术。我想你可能会对这个术语感到困惑。正如@CodeJack所说,这种对象在Javascript中不可用,但如果可以的话,它们在这种情况下就不适用了。@HMarioD:我很困惑?-特别要注意的是示例是JavaScript。@CodeJack:正如我上面的评论所提到的,信号量绝对适用于JavaScript。JavaScript没有的概念是锁,因为没有并发。信号量只是美化的计数器,通常与锁一起使用(因为在多线程环境中,您绝对需要它们)@HMarioD:可能是:)不过它结合了两个老笑话(),对我来说很有趣。