Хранение данных, возвращаемых с поста ajax. Должен ли я использовать async: false для хранения в var?Есть ли способ лучше? - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть этот код:

  $.post('http://localhost/test_zone/index.php/blog/new_post', { image_codes: images, info: fieldData, post_body: body },
    function(data){
     if (data.success) {
      if(data.error != ''){
        alert(data.error);
           }
      else {
        $('#preview_wrapper').css('display','none').html(data.postHTML).show(1000);
        $('#array_store').html(data.dataArray);
        }
      }
     else {
       alert('Sorry, an error occurred. No response from server.');
        }
       }

   ,'json');

Как видите, я собираю два бита данных - postHTML и dataArray - с помощью функции post ajax. Я хочу поместить dataArray в переменную. Я читал похожие вопросы, и я считаю, что решение состоит в том, чтобы использовать «async: false» - заставляя функцию ждать данные и вставлять их в переменную перед продолжением. Поэтому у меня есть несколько вопросов, касающихся этого:

  1. Во-первых, как вы устанавливаете «async: false», используя сокращение jquery $ .post, как я делаю выше, а не $ .ajax ({type: 'POST'})? Является ли это возможным? Это было бы полезно знать, но я нигде не могу разобраться или найти ответ.

  2. Я слышал много негативных комментариев об использовании 'async: false'. Вы бы порекомендовали это? Если нет, то как я могу просто сохранить строку данных на странице для дальнейшего использования? На данный момент, как вы можете видеть, я установил данные для вставки в div (для отображения: нет), что, по меньшей мере, кажется мне не идеальным.

  3. Почему функция не ожидает вставки данных в переменную, но когда вы устанавливаете ее для вставки данных в элемент на странице с помощью .html (), она работает? Я думаю, это как открыть дверь для строки данных, чтобы просто пролить на страницу в свое время ..? Но почему эта методология не может применяться для вставки данных в переменную - почему дверь также не может быть открыта для переменной? (Если вы понимаете, о чем я!).

Извините за довольно длинный вопрос - любые ответы или частичные ответы на вопросы выше будут очень благодарны. Благодаря.

РЕДАКТИРОВАТЬ: вот мой полный код (возможно, вы можете игнорировать все биты сбора данных, но я все равно опубликую партию) -

                $('#submit').click(function(){
                    $('#input_table').hide(1000);
                    if($('.image_info').length){
                        var images = [];
                        $.each($('.image_info'), function(img_count) {
                            var img_code = $(this).attr('class').split(' ').slice(-1);
                            images.push('"' + img_count + '"' + ':' + '"' + img_code + '"');
                            img_count++;
                        });
                    images = '{' + images + '}';
                    }else {
                        var images = 'none';
                    }
                    var editor = CKEDITOR.instances.editor1;
                    var body = editor.getData();
                    body = clean(body);
                    var fieldData = [];
                    var cleanValue ='';                     
                    $.each($('.field'), function() {
                        cleanValue = clean($(this).val());
                        fieldData.push('"' + $(this).attr('id') + '"' + ':' + '"' + cleanValue + '"');
                    });
                    fieldData = '{' + fieldData + '}';
                    $.post('http://localhost/test_zone/index.php/blog/new_post', { image_codes: images, info: fieldData, post_body: body },
                            function(data){
                                if (data.success) {
                                    if(data.error != ''){
                                            alert(data.error);
                                                        }
                                    else {
                                            $('#preview_wrapper').css('display','none').html(data.postHTML).show(1000);
                                            $('#array_store').html(data.dataArray);
                                         }
                                    }
                                else {
                                        alert('Sorry, an error occurred. No response from server.');
                                      }
                                        }

                        ,'json');
                    });     

Ответы [ 2 ]

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

Просто установите свои переменные:

  $.post('your_url', your_params,
     function(data){
       //Validation code here...
       window.postHTML = data.postHTML;
       window.dataArray = data.dataArray;     
  },'json');

Теперь у вас есть доступ к window.postHTML и window.dataArray глобальным переменным.Чтобы $ .post был синхронным (я бы не рекомендовал его), вы можете использовать $.ajaxSetup только один раз:

$.ajaxSetup({  //This will change behavior of all subsequent ajax requests!!
  async: false
});
$.post('http://localhost/test_zone/index.ph...) //Do $.post as usual

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

0 голосов
/ 02 декабря 2010

Вы не должны использовать async, потому что ваш браузер зависает.Я сделал это с событиями:

var evObj;
var _EVENT_RESULT = "resultEvent";

// Listen to the event
evObj.bind(_EVENT_RESULT, function(event, data){
  alert(data);
}

// Ajax-Request with event-triggering
$.ajax({
    type:       "POST",
    ...
    success:    function(data){
                  evObj.trigger(_EVENT_RESULT, data);
                }
});

Функция не ждет, потому что она асинхронная.Это хорошо, потому что ваш код не останавливается и ваш браузер не зависает.Если вы используете «.html ()», вы вставляете результат на страницу, если результат отправляется обратно с сервера.Может случиться так, что вы только «думаете», что это работает, потому что результат очень быстрый.Но если ваш сервер отправит результат обратно через 10 секунд, вы не получите результата на своей странице в течение 10 секунд - но: ваш графический интерфейс не висит.

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