Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
告诉javascript先运行jQueryAjax_Javascript_Jquery_Ajax - Fatal编程技术网

告诉javascript先运行jQueryAjax

告诉javascript先运行jQueryAjax,javascript,jquery,ajax,Javascript,Jquery,Ajax,简而言之,如何让警报(1)首先运行: $.post('example.php', function() { alert(1); }) alert(2); alert(3); alert(4); 但jQueryAjax调用似乎是在异步方法中运行的。所以JavaScript将首先运行下面的所有内容,从alert(2)到alert(4),然后返回到post方法alert(1) 当然,我可以将代码放在ajax函数中,但是当我有几十个函数时,这没有

简而言之,如何让警报(1)首先运行:

    $.post('example.php', function() {
        alert(1);
    })
    alert(2);
    alert(3);
    alert(4);
但jQueryAjax调用似乎是在异步方法中运行的。所以JavaScript将首先运行下面的所有内容,从alert(2)到alert(4),然后返回到post方法alert(1)

当然,我可以将代码放在ajax函数中,但是当我有几十个函数时,这没有任何意义,那么我必须将代码添加到所有函数中

    $.post('example.php', function() {
        alert(1);
        example();
    })

    function example() {
        alert(2);
        alert(3);
        alert(4);
    }
我想从ajax调用中获取一些json数据,稍后再使用。那么,有什么明智的解决方案吗

“当然,我可以将代码放在ajax函数中,但如果我有几十个函数,这就没有意义了,那么我必须将代码添加到所有函数中。”

有许多模式可以简化此操作,但是如果您说可能需要几十个函数来调用此post,您可以将此post放在一个函数中,并让函数接收回调

function myPost(callback) {
    $.post('example.php', function(data) {
        alert(1);
        callback(data);
    })
}


// These are your "dozens of functions"
function a2() { alert(2); }
function a3() { alert(3); }
function a4() { alert(4); }


// These would be at various places in your application
myPost(a1);
myPost(a2);
myPost(a3);
最终,最好的方法取决于您所说的“几十个函数”是什么意思,但您肯定不需要执行您似乎暗示的硬编码


将函数作为参数传递通常是一种方法,但如果需要的话,也有其他模式可以设置队列。

警报之所以按此顺序触发,是因为AJAX中的“a”代表异步

下面是代码的执行方式:

  • post
    方法向服务器发送请求,第二个参数是回调函数,服务器返回请求后将调用该函数
  • 然后进入
    post
    调用后的下一行代码,触发
    警报(2)
  • 然后下一行发射
    警报(3)
  • 然后下一行发射
    警报(4)
  • 此代码块在运行时完成,因此控制返回到事件循环
  • 一旦服务器返回Ajax请求,回调函数被称为firing
    alert(1)
解决这一问题的最佳方法可能是将所有代码移到回调中,这样它只会在返回请求后运行

$.post('example.php', function() {
    alert(1);
    alert(2);
    alert(3);
    alert(4);
})
可能没有必要把它放在另一个函数中,并按照问题末尾的建议调用它

我会避免“同步”Ajax请求,除了自相矛盾之外,它们与使用Ajax的整个目的背道而驰。使用Ajax应该使应用程序更具响应性,而使用同步请求恰恰相反,如果请求超时或需要很长时间才能从服务器返回,它可能会导致浏览器锁定。

这里有一种替代方法,可以使用jQuery的自定义事件。它基本上与其他非同步建议答案类似,只是看起来略有不同,可能会帮助您保持代码的整洁

使用对象将自定义事件绑定到。在该对象上使用jQuery的
on
方法绑定一个或多个处理程序。在异步函数结束时触发自定义事件,jQuery将为您完成其余的工作

例如:

(function($){
    var fakeAsync = {};
    function fakeAsyncFunction( ) {
        alert(1);
        $(fakeAsync).trigger('customDone');
    }

    function a( ) {
        alert(2);
    }
    function b( ) {
        alert(3);
    }
    function c( ) {
        alert(4);
    }

    window.setTimeout(fakeAsyncFunction, 1000);

    $(fakeAsync).on('customDone', a)
        .on('customDone', b)
        .on('customDone', c);
})(jQuery);

在jQuery中,我更喜欢使用$.when和$。这样做很容易,代码也更易于阅读

function CatchTheFish(){
console.log('we are catching the fish');
}
function EattheFish(){
console.log('now time to eat this fish');
}
$.when ( CatchTheFish() ).then( EattheFish() );

这段代码在jQuery 1.9.1的最新版本中运行

我是否遗漏了什么?只需将
alert(1)
放在回调函数之外,就像其他函数一样。第二种方法是正常的方法,您可以将返回的数据传递给
example()
@Brad-显然OP简化了代码,真正的代码是设置一个值或其他东西(问题确实提到了从Ajax调用获取数据并在以后使用它)。我想你可能在寻找这个非常常见的问题。你可以设置同步标志。我想如果你想在继续之前等待响应,你是否尝试过我相信这会解决你的难题。你认为I thing$是什么意思。什么时候或$。然后可以实现这一点:)我很抱歉,我应该澄清我有几十种ajax函数需要一个通用回调函数。我确实理解它发生的原因,但我确实想在其中加入一个回调函数,因为如果我有12个
$.post()
,那么我就必须硬编码12个times@aptx啊,,然后将它们共同的所有调用放在一个函数中,并在每个回调中调用它,就像你在问题末尾所建议的那样。我使用了一个变量来调用一系列依赖于用户输入的ajax函数,比如
example[variable]()
调用
example['search']()
example['login']()
,它们中的每一个都有随机的ajax函数来完成这项工作,使用
$。when()。then()
我只能编写一次代码,但是如果我把它放在回调函数中,我仍然必须对它进行硬编码
example\u callback()
12次,你是否看到了每个人的不同之处?我真的不喜欢setTimeout,我不知道为什么我要等待,每件事都应该在调用时尽快运行,而且我对触发事件不太熟悉,也许我需要对此进行一些回顾。谢谢您的帮助。@aptx我在这里使用
setTimeout
只是为了模拟AJAX请求的异步行为。我本可以使用jsFiddle的AJAX API,但我几乎从未使用过它,因此我必须阅读它。这些事件只是用作“全局通知系统”,类似于DOM事件。只要吸引更多的听众,你就完了。