передача функции, которая делает ajax-запросы к $ .when .done - PullRequest
1 голос
/ 08 февраля 2012

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

$.when(function(){
        $.each(oOptions, function(){
            var filePath = this.filePath,
            dataType = this.dataType;

            $.ajax({
                url : filePath,
                dataType : dataType
            });
        });
    })
    .done(function(){
        console.log('success');

        console.log(arguments);
    })
    .fail(function(){
        console.log('failed');
    });

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

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Вы передаете функцию $.when, в то время как вы должны передать один или несколько Deferred с. Вы можете заполнить массив deferreds и передать его $.when в качестве аргументов:

var deferreds = [];

$.each(oOptions, function() {
    var filePath = this.filePath,
    dataType = this.dataType;

    deferreds.push($.ajax({
        url : filePath,
        dataType : dataType
    }));
});

// use the array elements as arguments using apply
$.when.apply($, deferreds)
.done(function(){
    console.log('success');

    console.log(arguments);
})
.fail(function(){
    console.log('failed');
});
1 голос
/ 08 февраля 2012

Разве вам не нужно помещать логику "done" в аргументы вызова $ .ajax как функцию успеха?Я имею в виду что-то вроде этого:

$.ajax({
  url : filePath,
  dataType : dataType,
  success: function(){
    console.log('success');
  }
});

Поскольку вызовы ajax выполняются асинхронно, функция done () может быть вызвана до завершения вызовов ajax ...

...