2016-04-12 4 views
0

ли следующий сценарий:Выполнить динамическое число АЯКС запроса последовательно

Я должен отобразить графики для заданного интервала (STARTDATE, ENDDATE)

Поскольку интервал может быть достаточно большим, данные извлекаются в день, поэтому мне нужно сделать несколько вызовов Ajax последовательно и присоединить данные к графе (Highcharts)

примера интервал п дни ==>

ajax request day 1 

when is (done) ready ajax request day 2 

when is (done) ready ajax request day 3 

.... 

ajax request day n 

Я читал об отсроченном и обещании, но я затруднился с динамическим числом дней и требованием, чтобы получить ответы последовательно

Благодаря

+1

Но большой объем данных может привести к краху браузера; – itzmukeshy7

+0

Один из способов может использовать блок ** success ** каждого запроса ajax для запуска другого. Просто для обеспечения последовательности. Но это должно строго выполняться, если количество запросов ajax конечное и максимальное (2 или 3 запроса). – Abhi

+0

Ну ...лучше, чем сбой сервера :) Идея в том, что она работает на том, что называется сервером администратора с очень небольшим объемом памяти (256 МБ). У браузера больше наверняка. – Cris

ответ

-1

Если вы используете Jquery в вашем приложении попытаться толкая весь Аякс в массив

бывшего [Аякс, Аякс, ...]

, а затем пользователь

$.when([ajax,ajax,...]).then(function(){ 
console.log(arguments);// you will get the success messages in arguments array 
}) 
+0

Это когда все они закончены .... НО все они выполняются параллельно, мне понадобится последовательное выполнение. Поэтому, когда день 1 извлекается, получите день до ... и т. д. – Cris

0

Как насчет рекурсивного вызова. Создание параметризованных функций и передать день функции, как,

функции getDetails (день) {

// ajax call 
// In the callbacks call the getDetails function by updating the date 

}

+0

Вы должны добавить более подробную информацию, также вы не создаете цикл –

+0

Если мы собираемся вызывать функцию (рекурсивно) в обратных вызовах, обновляя дату, то зачем нам нужны циклы? – srinath

+0

Извините, я не проявил себя хорошо, и у меня создалось впечатление, что ОП хотел сделать запрос каждые 24 часа. –

1

Не уверена, что если вы уже догадались, но хороший способ для решения ваша проблема будет заключаться в использовании комбинации jQuery.Deferred и рекурсии. Проверьте этот пример кода и увидеть, если это поможет прояснить вещи:

function getData(dayLimit) { 
 
    var allDone = $.Deferred(); 
 

 
    var getDataForDay = function(day) { 
 
    doAsyncThing(day).done(function() { 
 
     if (day < dayLimit) { 
 
     getDataForDay(day + 1); 
 
     } else { 
 
     allDone.resolve(); 
 
     } 
 
    }).fail(function(){ 
 
     /* 
 
     Reject the deferred if one of your operations fails. 
 
     Useful if you're binding "fail" or "always" callbacks 
 
     to the promise returned by getData. 
 
     */ 
 
     allDone.reject(); 
 
    }); 
 
    }; 
 

 
    getDataForDay(1); //start with first day 
 

 
    return allDone.promise(); 
 
}

Позвольте мне знать, если вам нужно больше разъяснений, рад помочь!

1

Если вы можете сохранить список дат в массиве, вы можете использовать что-то вроде этого:

var items = ['Apple', 'Orange', 'Banana', 'Alphalpha']; 

//replaceable with any function that returns a promise 
function asyncFunction(item) { 
    return $.ajax({ 
    url: '/echo/html', 
    type: 'POST', 
    data : item 
    }) 
    .then(function(data){ 
    $('body').append('<div>Got the response from '+item+'</div>'); 
    //stuff stuff stuff 
    }); 
} 

function sequence(arr, callback) { 
    var i=0; 

    var request = function(item) { 

    return callback(item).then(function(){ 

     if (i < arr.length-1) 
      return request(arr[++i]); 

    }); 
    } 

    return request(arr[i]); 
} 

sequence(items, asyncFunction).then(function(){ 
    $('body').append('<div>Done with all!</div>'); 
}); 

https://jsfiddle.net/7ojy9jnx/2/

В основном, sequence принимает Array элементов и выполняет функцию на всех из них (в этом случае asyncFunctions, который может быть заменен любой функцией), функция, которая возвращает обещание.

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