Добавление ровно 100 значений в базу данных с помощью ajax - PullRequest
6 голосов
/ 28 марта 2011

Привет, ребята, 3:36 утра, и мне нужен умственный заряд.

Простой вопрос, какой самый простой / быстрый способ добавить 100 баллов в базу данных. Пожалуйста, предположите, что все записи не будут работать из-за дубликатов, плохих данных и т. Д.

Я пытаюсь обновить базу данных точно с 100 значениями.

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

Эта функция просто записывает координаты широты / долготы в базу данных. Если есть дубликат или запись не удалась, я посылаю «ошибку» из php, и цикл должен продолжить сбор данных, пока у меня не будет ровно 100 точек в базу данных. Вот функция, которую я использую.

cct используется для предотвращения xss, пожалуйста, игнорируйте его, это прекрасно работает.

////more above this
if(100-completed > dispatched)
    dispatched++;
    updateDB(lat,lng);
/// more junk and then this function
function updateDB(lat,lng)
{
    var cct = $("input[name=csrf_mysite]").val();
    $.ajax({
        type: "POST",
        url: "/form",
        data: { 
            'lat': lat,
            'lng': lng,
            'id_set': id_set,
            'csrf_complexity': cct },
        success: function(result) {
            var obj = jQuery.parseJSON(result);
            if( obj.status === "OK" )
            {
                completed++;
                var marker = new google.maps.Marker(
                {
                    icon: markerIcon,
                    position: new google.maps.LatLng(lat, lng),
                    map: map
                });
                $( "#progressbar" ).progressbar( "option", {
                    value: completed,
                    max: 100
                });
                $("#amount").text("Getting image " + completed + " of 100");
            }
        },
        error: function(data){
            //alert(data.responseText);
            },
        complete: function(data){
            if(completed == 100)
                window.location = "/start/curate";
            dispatched--;
        }
    });
}

Эта функция не работает. Так есть идеи почему?

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

Идеи? Или любой другой способ сделать это было бы замечательно.

Ответы [ 8 ]

4 голосов
/ 28 марта 2011

Почему серверный код не занимается подсчетом и не отправляет только один (или несколько) запросов?Например, сначала создайте массив из 100 точек данных, отправьте данные на сервер одним запросом и попросите его ответить, сколько еще нужно, а затем отослать столько назад и повторять до тех пор, пока не получите 100.

Если накладные расходы на получение каждой части данных на клиенте очень малы, и вполне нормально получать данные, которые вам не нужны, тогда просто отправьте (скажем) 110 сначала.Зная некоторое количество отказов, вы сможете легко это оптимизировать.

В любом случае, у вас может быть (как мне кажется) только два одновременных асинхронных запроса, так что асинхронность или нет, это займет много времени.время сделать это.Я не могу придумать ни одной причины, чтобы не группировать данные как можно больше и сократить количество запросов до 1 или нескольких.Даже если вы по-прежнему выполняете 100 запросов к базе данных на сервере, время для этого не является значительным по сравнению с издержками HTTP-сообщения / ответа.

3 голосов
/ 13 апреля 2011

Напишите свой серверный скрипт, чтобы ответить цифрой. Затем в первом запросе вы отправили 100 точек данных:

Browser             Server
  |                   |
  |---> 100 data ---> |
  |<- send 20 more <- |
  |                   |
  |--->  20 data ---> |
  |<- send  1 more <- |
  |                   |
  |--->  1  data ---> |
  |<- send  0 more <- |
  |                   |
  v                   v

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

Все, что нужно сделать клиенту, это отправить все, что он может, и опросить сервер, сколько еще нужно. Кроме того, вы хотите отправлять несколько точек одновременно из-за накладных расходов Ajax-запроса, но не хотите отправлять намного больше, чем на самом деле нужно, потому что это тоже расточительно.

Надеюсь, это поможет.

1 голос
/ 28 марта 2011

if(100-completed > dispatched) должно быть:

while(100-completed > dispatched)

Предполагается, что для завершения задано 0.

0 голосов
/ 15 апреля 2011

Редактировать: не обращайте внимания на этот ответ, пропавшие скобки в операторе 'if' отбросили меня, updateDB вызывается только тогда, когда 100-completed > dispatched верно?

Предполагая, что я понимаю вашу проблему, похоже, это может быть проблема времени. Например, когда завершено = 99, функция updateDB может быть вызвана еще 4 раза, прежде чем в первый раз будет выполнен успешный обратный вызов, когда завершено было 99, а затем у нее все еще есть 3 в очереди (в зависимости от кода, окружающего 'if ' заявление). Таким образом, это будет медленнее, но если вы можете быть уверены, что updateDB не будет вызываться снова до тех пор, пока не будет завершен обратный вызов (и / или success / error, если вы думаете, что не завершается каждый раз), думаете ли вы, что может это исправить?
Это порядок, который я представляю выполняемыми строками, если вы установите точки останова на две строки updateDB(lat,lng); и completed++:

  1. updateDB (лат, LNG); (где завершено = 99)
  2. updateDB (лат, LNG); (где завершено = 99)
  3. updateDB (лат, LNG); (где завершено = 99)
  4. updateDB (лат, LNG); (где завершено = 99)
  5. завершен ++; (завершено сейчас = 100, еще 3 вызова ajax еще выполняются)
  6. завершен ++; (завершено сейчас = 101)
  7. завершен ++; (завершено сейчас = 102)
  8. завершен ++; (завершено сейчас = 103)

Моей первой идеей было бы добавить флаг в завершенный обратный вызов, например:

выполнено: функция (данные) {
ok_to_run_again_flag = TRUE;
отправлено--;
если (выполнено == 100)
window.location = "/ start / curate";
}; * 1 029 *

и

if ((100 выполнено> отправлено) && ok_to_run_again_flag)
{
ok_to_run_again_flag = ложь;
отправлены ++;
updateDB (лат, LNG);
}

Мне также интересно, почему вы говорите: «Диспетчеризация не уменьшается должным образом». Какова его стоимость по сравнению с тем, что вы ожидаете?

0 голосов
/ 15 апреля 2011

Я думаю, что у вас есть ошибка в коде, но я не уверен, что это просто ошибка ввода.

if(100-completed > dispatched) dispatched++; updateDB(lat,lng);

На основании вашего отступа вы хотите вызвать updateDB в предложении if, но вы не использовали фигурные скобки, поэтому вы вызываете его, даже если утверждение верно или нет. Без этой ошибки, хотя ваша реализация была бы лучше, если бы вы использовали метод, предложенный @jamietre, ваш код должен работать.

0 голосов
/ 14 апреля 2011

Может быть, это моя личная любовь к JSON и сериализации данных формы, но не задумывались ли вы о том, чтобы просто сериализовать пакет данных на стороне клиента, отправить данные и запросить ответ "успешно / неудачно"?

0 голосов
/ 12 апреля 2011

Странно.Я смог загрузить около 1000 маркеров карты, загруженных в БД, менее чем за одну секунду.

Вы должны загрузить все 100 серверных частей и добавить их в один запрос.Стоимость запроса, как правило, довольно велика (для простой задачи, такой как подключение к БД и загрузка одного элемента, это может быть как 70% времени, потраченного на запрос, и 30% на фактическую работу)

0 голосов
/ 28 марта 2011

Вы хотите добавить async: false к вашему вызову .ajax и увеличивать / уменьшать в соответствии с методами успеха / ошибки, которые вы написали.

Если вы хотите, чтобы это было последовательнымИтеративный процесс, когда пользователь вводит 100 значений по одному, и ваша программа перестает запрашивать информацию, когда она имеет 100 значений, вы можете захотеть выполнить простую проверку на стороне сервера и таким образом обновить свои заполненные / отправленные значения.Однако установка async: false в вашем вызове .ajax заблокирует вас и будет ждать ответа на вызов, прежде чем продолжить переадресацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...