Остановка обещания цепи AJAX - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над страницей, чтобы помочь мне отсортировать файлы фильмов. И вместо того, чтобы сделать один ajax-запрос и ждать вечно, чтобы увидеть какой-либо прогресс, я запрашиваю информацию о файле в виде кусков. Я также заранее извиняюсь, поскольку вся эта отсроченная / обещанная вещь действительно нова для меня, поэтому я могу не использовать всю правильную терминологию.

Вот как выглядит мой код JavaScript

// Used to get info about a chunk of movies
var parse_movie_file = function (index){
    return $.ajax({
        type: 'GET', 
        url: '/movies/get_info', 
        dataType: "json", 
        data: {'movie_index': index} 
    }); 
};

$('form').submit(function(e){
    // This first request gets a list of files to be parsed
    $.ajax({
        type: 'GET',
        url:  '/movies/get_list',
        data: $(this).serialize(),
    }).done(function(r){
        // Create a Deferred object for parsing filenames
        var parse_deferred = $.Deferred(); 
        // Set deferred to resolve to start parsing filenames
        parse_deferred.resolve();

        for (var i = parse_max_progress - 1; i >= 0; i--) {
            // Try/Throw/Catch keeps 0 from being used in all asynchronous parse_movie_file calls 
            try{throw i} 
            catch(ii){
                parse_deferred = parse_deferred.then(function(){
                    return parse_movie_file(ii, table_body, row_template).done(function(r){
                        // Update page with response info
                    }); 
                });
            } 
        }
    // <place holder>
    });
});

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

Могу ли я разорвать цепочку обещаний и остановить любые открытые запросы ajax?

Кроме того, если мне разрешают побочный вопрос, если я перемещаю parse_deferred.resolve(); в // <place holder>, я получаю сообщение об ошибке, в котором говорится, что parse_deferred не имеет функции resolv (). Любая мысль об этом

...