djtahoma
@djtahoma
PHP Developer

Как сделать функцию асинхронной, используя JQuery Deferred?

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

На странице есть таблица с чекбоксами и кнопка, по нажатию на кнопку:

1. Должна отобразится gif картинка, показывающая, что процесс запустился.
2. Одновременно с этим, должен запуститься цикл each(), который соберет данные из отмеченных строк в массив numbers.
3. После завершения цикла, нужно скрыть gif и вывести результаты.

Я перепробовал много различных вариантов, но картинка у меня все равно блокируется, до тех пор, пока полностью не выполнится each()

$(function() {
	$( "#btnShow" ).button().click(function() { 

		$('.preloader').fadeIn(); 
		
		var checkedRowId=$("#table").yiiGridView("getChecked", "selectedRow");
		var numbers = new Array();
		
		$.each( checkedRowId, function( i, l ) {
			numbers.push(  $("#table").children('id="row' + l + '"').children(':nth-child(7)').text() );
		});
		
		console.log(numbers);
		$('.preloader').fadeOut();
	});
});
  • Вопрос задан
  • 2944 просмотра
Решения вопроса 1
benbor
@benbor
Помог ответ - не забудь лайкнуть
судя по вот этой ссылке api.jquery.com/promise/#example-1
$("a").click(function() {

    $('.preloader').fadeIn();
    $('.preloader').promise().done(function(){
        // теперь картинка полностью появилась
        var defer = $.Deferred();
        defer.then(function() {
            // подсчет закончен, прячем картинку
            $('.preloader').fadeOut();           
        });
        
        setTimeout(function() {
            $("#result").append("Выполнилась долгая функция");
            defer.resolve();
        }, 2000) ;
       
    });
});

jsfiddle.net/xfzbcghz/2
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы