jQuery: выполнение синхронного AJAX запроса с последующей цепочкой других ajax запросов - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть приложение ASP. NET MVC, и я пытаюсь создать цепочку операций, одну за другой, используя jQuery внутри функции javascript. Функция состоит из трех частей.

Я пытаюсь сделать следующее: если какое-либо условие удовлетворяется, я хочу выполнить синхронный jQuery ajax вызов CheckData. Зависит от полученного результата:

  • Возвращается нормально -> Я хочу продолжить выполнение part2 и, наконец, part3 в этом порядке.
  • Возвращает Nok ->, затем завершается и возвращается. Он не продолжает выполнять part2 и part3.

Поэтому я установил asyn c: false, но он не работает, программа продолжает выполнять part2 и part3. Я знаю, asyn c: 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";
    }

1 Ответ

1 голос
/ 14 февраля 2020

Нет необходимости делать это синхронным. Если вы хотите, чтобы «PART 2» и «PART 3» ожидали окончания ajax -запроса до sh, просто поместите их в функцию и вызовите их в случае успеха:

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({...})*/}
}
...