【问题标题】:jQuery: Performing synchronous AJAX request followed by a chain of other ajax requestsjQuery:执行同步 AJAX 请求,然后执行一系列其他 ajax 请求
【发布时间】:2020-02-14 14:38:08
【问题描述】:

我有一个 ASP.NET MVC 应用程序,我正在尝试在 javascript 函数中使用 jQuery 一个接一个地进行一系列操作。该函数由三部分组成。

我想做的是:如果满足某些条件,那么我想执行同步的 jQuery ajax 调用 CheckData。取决于返回的结果:

  • 返回 ok -> 我想继续执行 part2,最后按这个顺序执行 part3。
  • 它返回 Nok -> 然后它完成并返回。它不会继续执行 part2 和 part3。

所以我设置了 async: false 但它不起作用,程序继续执行 part2 和 part3。 我知道 async:false 已被弃用,那么我该如何实现呢?

function onCheckValidData()
{
    // do something....

    // PART 1 STARTS HERE

    if (some_condition_is_satified)
    {
        $.ajax({
            url: '@Url.Action("CheckData", "MyController")',
            async: false,
            type: "POST",
            dataType: "JSON",
            beforeSend: function () {
                showLoading();
            },
            success: function (result) {
                if (!result.isOk) {
                    return;
                }
            },
            complete: function(){
                hideLoading();
            }
        });
    }

    // PART 2 STARTS HERE

    // do something.....
    // continue doing more thing.....
    // more things.....

    // PART 3 STARTS HERE

    $.ajax({
        url: '@Url.Action("MyActionMethod1", "MyController")?' + paramsStr,
        type: "POST",
        dataType: "html",
        beforeSend: function () {
            showLoading();
        },
        success: function (result) {
            if (result == 'True') {
                jsMethod2();  // jsMethod2 is another javascript method which contains another $.ajax block
            }
            else if (result == 'False') {
                jsMethod3(); // jsMethod3 is another javascript method which contains another $.ajax block
            }
            else {
                alert(result);
            }
        },
        complete: function(){
            hideLoading();
        }
    });
}

我在控制器中的操作:

    private JsonResult CheckData()
    {
        MyBoolResult res = new MyBoolResult();

        // do something....

        return Json(new { isOk = res.isOk });
    }


    public String MyActionMethod1(String param1, String param2, bool param3, string param4, string param5)
    {

       // do something

       return condition ? "True" : "False";
    }

【问题讨论】:

  • 没有理由使用同步 AJAX。不要做。要实现您需要的功能,只需将其他 AJAX 请求放在它们自己的函数中,然后从它们依赖的 AJAX 调用的回调中调用它们,如果需要,在参数中传递数据。
  • 退后一步...您为什么希望这些请求是同步的?您试图在应用程序中实现的实际行为是什么?从行为开始,您应该能够对异步操作进行建模以实现该行为。
  • 你为什么不在 ajax 中使用 ajax 呢? if(result.isOk) { // Run the second part here } else { return false; }
  • @David 我需要同步调用,因为我需要按顺序执行它们。我已经成功应用了Mischa解决方案。

标签: javascript jquery ajax asp.net-mvc asp.net-ajax


【解决方案1】:

无需同步。如果您希望“第 2 部分”和“第 3 部分”等待 ajax 请求完成,只需将它们放入一个函数并在成功时调用它们:

function onCheckValidData()
{
    // do something....

    // PART 1 STARTS HERE
    if (some_condition_is_satified)
    {
        $.ajax({
            url: '@Url.Action("CheckData", "MyController")',            
            type: "POST",
            dataType: "JSON",
            beforeSend: function () {
                showLoading();
            },
            //Success will execute only if the ajax-request is finised
            success: function (result) {
                if (!result.isOk) {
                    return;
                }
                part2(); 
                part3();
            },
            complete: function(){
                hideLoading();
            }
        });
    }

    // PART 2 STARTS HERE
    function part2 () {/*do something.....*/}

    // PART 3 STARTS HERE
    function part3 () {/*$.ajax({...})*/}
}

【讨论】:

  • 我已经应用了您的解决方案并且它工作正常。谢谢。
猜你喜欢
  • 2011-10-04
  • 2011-10-09
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多