【问题标题】:Need to wait until XMLHttpRequest completes需要等到 XMLHttpRequest 完成
【发布时间】:2012-10-01 07:55:44
【问题描述】:

每当我试图找到这个问题的答案时,每个人都会提到 ajax 启动/停止等。

我正在使用XUI JS's XHR函数进行跨域调用,现在我想要这样

callMyXHRfunction();
callNextFunctionWhenAboveFunctionResponded();

即我应该继续前进,直到我的 xhr 函数响应(成功或失败)

更新

用例:

有一个函数叫做getAllData(),这个函数获取我当前提交给服务器的所有数据。我需要经常调用这个函数来获取最新数据并继续前进。在登录时,我调用此函数以获取最新数据,每 10 分钟后我需要调用此函数以刷新数据。

因此,如果我在成功函数上调用我的每个函数,那么我的代码可能会使其他开发人员感到困惑,如果我像上面那样编写,他/她将很容易知道第一行和第二行发生了什么。

希望现在大家都非常了解我的情况。

【问题讨论】:

    标签: javascript xui


    【解决方案1】:

    在您引用的网站上查看第三个示例:

    x$( selector ).xhr( url, fn );
    

    第二个参数可以是回调,回调是您可能开始寻找的关键字。

    或者,通过提供async: false 作为选项来使用同步调用。

    x$("body").xhr("http://the-url",{ async: false });
    

    控制流将暂停,直到请求返回,然后才继续执行下一个函数。参考http://jsfiddle.net/ZQ9uw/

    【讨论】:

    • 是的,在这种情况下,我需要在回调函数中调用 callNextFunctionWhenAboveFunctionResponded(),我不希望这样,因为在很多情况下我需要调用 callMyXHRfunction() 并且每个回调都有不同的操作,希望你明白我的意思
    • 我实际上不明白。如果您必须使用在成功时执行的不同函数来响应每个跨域调用,那么就没有办法为每个成功的 XHR 调用指定要调用的单独函数。也许看看你的两个 call*() 函数的更多内容会有所帮助,这样我们就能更好地理解你的问题。
    • 添加了一个用例,如果您仍有任何疑问,请查看并告诉我
    • Ravi,禁用异步执行将完全满足您的需求,您只需将其应用于您的代码,所以我会说您的问题得到了回答。除此之外,我完全同意@Jon 的观点,即这是一种不好的做法,尤其是对于您刷新数据的用例而言,如果像这样的事件驱动编程让他们失望,您绝对应该鼓励您的团队成为更好的程序员。无论如何,如果您无法修复您的流程,那么您的答案就是不使用异步。
    • 所以按照你和乔恩的说法,我应该使用回调函数中的所有函数,否则我必须禁用异步,是吗?但我不能禁用(由于要求)这只是一个例子,我有很多这样的场景。我想要 jQuery When(api.jquery.com/jQuery.when) 之类的功能。
    【解决方案2】:

    您需要以指定回调函数的方式进行.xhr 调用,并将您的“下一个”函数作为回调传递。

    所以你会这样写:

    callMyXHRFunction(nextFunctionToCall); // no parens after nextFunctionToCall!
    
    function callMyXHRFunction(callback) {
        $("something").xhr(url, {
            error: callback, // so that nextFunctionToCall is called on error
            callback: callback, // so that nextFunctionToCall is called on success
            async: true
            // add more options here
        });
    }
    

    【讨论】:

    • 是的,我现在只能这样,传递参数和操作等,有什么办法可以像我上面提到的那样做,我只想等到有任何回应然后移动,不像将流向另一个方向移动
    • 您可能正在寻找的是同步调用。我相应地更新了我的答案。
    • @Ravi:有,但 IMO 这是非常糟糕的做法,我不会因为写这样的代码而被抓到死。
    • @Jon:但 IMO 这是最好的方法,因为如果我的队友在一个函数中看到许多条件,他/她可能会感到困惑,我更新了我的答案并添加了一个用例,请告诉我如果这有帮助
    猜你喜欢
    • 2021-03-07
    • 2018-12-20
    • 1970-01-01
    • 2021-02-15
    • 2010-12-19
    • 1970-01-01
    • 2020-05-23
    • 2015-04-12
    • 2020-11-20
    相关资源
    最近更新 更多