Панель Kendo Progress не инициируется во время вызова ajax

Я хочу реализовать индикатор выполнения Kendo для моего ajax-вызова на стороне сервера. Я пытался, но он не инициируется перед вызовом ajax, и если я использую функцию setTimeOut ниже для закрытия вызова ajax, индикатор выполнения отображается только в течение короткого времени. Например:

 setTimeout ( function() 
       {
        kendo.ui.progress($("#progressBar"), false); //close the progress bar       
       },5000);

В приведенном выше коде индикатор выполнения отображается только в течение 5000 миллисекунд, после чего он закрывается. Вот мое актуальное требование.

Мне нужно сделать два Ajax-вызова, один внутри другого. Я хочу реализовать индикатор выполнения до начала первого вызова ajax и хочу закрыть его после завершения второго вызова ajax. Другой вариант заключается в реализации индикатора выполнения до того, как первый вызов ajax инициируется, и его закрытии после завершения первого вызова, затем инициировании индикатора выполнения для второго вызова ajax и его закрытии после завершения второго вызова ajax.

Я надеюсь, что мое требование ясно. Если вам нужно больше деталей, пожалуйста, дайте мне знать. Вот мой код:

 <div id="progressBar"></div>

   <script> 
        var getResponseFromSOA = function(filterObject, file,verb, callback) {      
    createFilterString(filterObject, function(filterString) {// get the filter string
        if(jQuery) {// check the jQuery file is integrated or not
            var headers = {Authorization: COOKIES.readCookie("Authorization"),requestmode:"ACK_URL"};
            headers.isRender = file.isRender;
            if(file.inputDataHeaders)
                headers.inputData = file.inputDataHeaders;
            /*
             * Since it is async call that's why call will be 2 times.
             * 1st time we have to call to the request handler of the SOA.
             * In the response we will get one link address of response handler.
             * 2nd time we have to call that link what we got from the 1st request.
             * Response handler will give actual data in the data property of the response
             */

                    kendo.ui.progress($("#progressBar"), true); //Here progress bar will initiate

                jQuery.ajax({
                    url: file.fileUrl + "/" + $securityComponent.cryptograghicFunctions.encryptor(filterString),
                    type: verb,
                    headers: headers,
                    async: false,
                    error : function()
                    {
                        console.log("some error occured at getResponseFromSOA submitting the request");
                    },
                    success: function(responseDataFromRequestHandler) {                         
                        // again call because it is async mode form SOA team
                        jQuery.ajax({
                            url: responseDataFromRequestHandler.links[1].href,
                            async: false,
                            headers: {Authorization: COOKIES.readCookie("Authorization"),requestmode:"ACK_URL"},
                            success: function(responseDataFromResponseHandler) {
                                try {
                                    console.log(responseDataFromResponseHandler);
                                    if(callback) callback(responseDataFromResponseHandler.data);
                                }catch(e) {
                                    console.log(responseDataFromResponseHandler);
                                    // printing the error message in the console window
                                    console.log("Error in the callback in data-transactor-js > getResponseFromSOA"
                                            + "\n"
                                            + e.message);
                                }
                            },                          
                            complete: function() {

                                    kendo.ui.progress($("#progressBar"), false); //close the progress bar       

                            }
                        });
                    },
                    complete: function() {                          
                            kendo.ui.progress($("#progressBar"), false); //close the progress bar       

                    }
                });


        } else throw {message: "jQuery is not defined or jQuery file is not linked"};
    });
};

</script>

Заранее спасибо...

1 ответ

Решение

Несколько вещей здесь.
1. Kendo использует JQuery, но вы пытаетесь инициализировать виджет прогресса до инициализации обработчика JQuery. Всегда помещайте код Kendo в обработчик JQuery и обязательно включайте ссылку на библиотеку JQuery перед вашими скриптами Kendo.

<script>
$(function ()
{
    kendo.ui.progress($("#progressBar"), true);

    // Make your ajax call here
}

2. Убедитесь, что введенный вами код отключает индикатор выполнения в каждом возможном пути кода, иначе он будет работать бесконечно, и ваши пользователи не смогут продолжить. В вашем примере у вас есть kendo.ui.progress($("#progressBar"), false в обработчике Complete для второго вызова, но не для первого. Если пользователь получит сообщение об ошибке при первом вызове, индикатор выполнения никогда не будет отключен.

3. Вы отключаете асинхронный режим здесь, в коде, но ваш комментарий заставляет меня думать, что вы этого не хотите. async:false здесь не требуется, так как вы делаете второй вызов AJAX в случае успеха первого. Делая это таким образом, вы сами контролируете порядок выполнения вызовов.

4. Я думаю, что вы уже знаете это, но установка заранее заданного значения времени ожидания для любого типа индикатора прогресса не является хорошей идеей, потому что у вас нет способа узнать, сколько времени займет этот процесс.

Другие вопросы по тегам