2009-08-04 2 views
39

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

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
      } 
     } 
    }); 
    return result; 
} 

И я считаю, что «результат» пустая строка. Итак, я пробовал это:

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       return result; 
      } 
     } 
    }); 

} 

Но это тоже не сработало. Как я могу получить responseText для использования другого метода?

ответ

27

Помните, что onComplete называется long after someFunction выполняется. Что вам нужно сделать, так это передать функцию обратного вызова функции somefunction в качестве параметра. Эта функция будет вызываться, когда процесс выполняется работает (т.е. OnComplete):

somefunction: function(callback){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       callback(result); 
      } 
     } 
    }); 

} 
somefunction(function(result){ 
    alert(result); 
}); 
+0

Ваш ответ замечательный, более функциональный/oop-стиль, и действительно, действительно замечательный. Тем не менее, [кто-то] ответил на это: асинхронный: ложь более легкая и облегчает то, что хотел автор вопроса (но ваше решение более расширяемо и гибко). –

+1

асинхронный: false останавливает браузер до получения ответа. Если сетевое подключение выполняется медленно, поэтому для соединения с сервером требуется несколько секунд, тогда весь браузер может зависнуть на несколько секунд и не будет отвечать на ввод пользователя. Это не удобство использования. Это может быть проще, но оно не ведет себя хорошо, и поэтому ** 'асинхронный: false' никогда не должен использоваться **. – Marius

+0

Извините, я раньше не использовал асинхронный. Вы правы, так что это в основном то же самое, что и функция ajaxLoader() {var fAjaxLoaded = false; $. Ajax (..., success: function() {fAjaxLoaded = true;}); while (fAjaxLoaded); return ...} ' –

3

Как насчет добавления «асинхронное: ложь» в вашем коде? В моем случае это сработало хорошо :)

+0

, который побеждает цель ajax правильно? –

+5

Это плохо, потому что с синхронными запросами вы блокируете все выполнение JS в браузере до тех пор, пока запрос не вернется. – finishingmove

+1

Поражает цель, но экономит ваш день. –

Смежные вопросы