L oop печать после завершения функции получить несколько данных - PullRequest
0 голосов
/ 09 апреля 2020

Я создал веб-приложение для хранения предложения, запрошенного у клиентов.

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

Для этого я пытаюсь распечатать после того, как была сделана функция для извлечения данных из json и построения страницы.

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

Эта функция считывает данные предложения с сервера

                        function prev_edit(id){
                            return $.ajax({
                                type        : 'POST',
                                url         : 'json/get.php?t=2&p='+id,
                                dataType    : 'json',
                                encode      : true
                            })
                            .then(function(data) {
                                var prom;
                                if ((data)["success"]===false) {
                                    ...do something...
                                    prom=$("#edit").show("slow").promise();
                                }
                                return prom;
                            });
                        };

Эта функция работает, когда я нажимаю кнопку печати. ​​

                        $('#prev_print').on("click",(function( event ) {
                            $.ajax({
                                type        : 'POST',
                                url         : 'json/get.php?multi='+$("#id").val(),
                                dataType    : 'json',
                                encode      : true
                            }).then(function(data) {
                                if ((data)["success"]===true) {
                                    $.each((data)["multi"], function( i, n ) {
                                        prev_edit(n).then(function(){
                                            window.print();
                                        });
                                    });
                                }
                            });
                        }));

Я попытался также отложить объект, но кажется, что prev_edit (n) .then не ждет, когда завершится функция работа.

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете попробовать:

  • вместо простого .each(), сериализовав итерацию data.multi.
  • Ожидание $("#edit").show('slow').promise() путем его возврата.

Вы также можете:

  • ловить и глотать ошибки, возникающие в результате prev_edit() процесса
  • ловить любую неожиданную ошибку с терминалом .catch()

В конечном итоге вы должны получить что-то вроде этого:

function prev_edit(id) {
    return $.ajax({
        'type': 'POST',
        'url': 'json/get.php?t=2&p=' + id,
        'dataType': 'json',
        'encode': true
    })
    .then(function(data) {
        if (!data.success) {
            ...do something...
            return $("#edit").show('slow').promise();
         // ^^^^^^
        }
        throw new Error('prev_edit failed');
     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    });
};

$('#prev_print').on('click', function(event) {
    $.ajax({
        'type': 'POST',
        'url': 'json/get.php?multi=' + $('#id').val(),
        'dataType': 'json',
        'encode': true
    })
    .then(function(data) {
        if (data.success) {
            // serialize the preview/print process with data.multi.reduce(...)
            data.multi.reduce(function(promise, n) {
                return promise.then(function() {
                    return prev_edit(n)
                    .then(function() {
                        window.print();
                    })
                    // catch possible error arising from prev_edit().
                    .catch(function(error) {
                        console.log(error);
                        // swallow (don't rethrow) the error.
                    });
                });
            }, Promise.resolve());
        }
    })
    .catch(function(error) {
        console.log(error);
        // no need to rethrow the error as this is top-level code.
    });
});

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

...