2015-08-26 2 views
1

Я пытаюсь построить функцию jQuery ajax, которая является полностью общей. Он будет получать все данные и даже тип запроса в качестве параметров. После этого он заменит соответствующие переменные и построит запрос. Вот код ...Как сделать этот общий запрос ajax возвращать полученные данные?

function server_request (type, url, dataType, data) { 
    var packet; 
    var response = null; 

    if (packet) { 
     packet.abort(); 
    }; 

    if (type == "get") { 
     packet = $.ajax({ type: type, url: url, dataType: dataType }); 
     packet.done(function(returned_data){ 
       response = returned_data; 
     }); 
    } 
    return response; 
    response = null; 
} 

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

+0

сделанный, происходит в другом контексте, поэтому return resposne будет null. Вы можете сделать блокирующий вызов ajax раньше, но теперь он обосолете, потому что это вызвало проблемы с перфорацией. Что вам нужно сделать, это предоставить обратный вызов в ваш общий mehtod и привязать к этому обратному вызову функции, вызывающей его, вернуть resposne в code.done code ... не в код server_request. – ppumkin

+0

Да, это дублированный ответ: см. Предлагаемую ссылку http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call – gaetanoM

+0

@gaemaf, если это дубликат оригинальный вопрос, я должен удалить это или что-то в этом роде. (Я новичок на этом сайте). – mbz

ответ

2

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

Возможно, вы должны вернуть все packet и позвонить packet.done(), где вам нужен ответ на.

+0

ВЫ - один УДИВИТЕЛЬНЫЙ человек !!!!!!!!!!!!!! вы только что сделали свой день: D: D: D СПАСИБО ВАМ ТАК ЧЕМ! Надеюсь, у вас потрясающий день (даже месяц, год, целая жизнь)! – mbz

+0

На самом деле это тоже классно. Я не знаю, что вы можете это сделать ^^ – ppumkin

1
function server_request (type, url, dataType, data, _callBack) { 

    var packet; 
    //var response = null; //not needed 

    if (packet) { 
     packet.abort(); 
    }; 

    if (type == "get") { 
     packet = $.ajax({ 
      type: type, 
      url: url, 
      dataType: dataType, 
      callback: _callBack 
     }); 
     packet.done(function(returned_data){ 
       //this context is a new context, coming from the AJAX constructor 
       //response = returned_data; //this is assigning the data too late 
       return this.callback(returned_data); 
     }); 
    } 
    //this context wont return anything because its not the AJAX context. 
    //return response; 
    //response = null; 
} 

При создании объекта Ajax, вы можете назначить любой произвольные данные в конструкторе (правила JavaScript из-за этого!) - Таким образом, вы определяете свойство обратного вызова и присвоить _callbackFunction Вы предоставили это свойство.

В контексте package.done вы вызываете функцию обратного вызова и передаете данные ответа.

Ваш метод вызова будет выглядеть следующим образом.

server_request('type','url','datatype','data', 
     function(returnedData){ 
      //now you can work with the returend data in the correct context. 
     }); 
+0

Спасибо. Мне тоже нравится эта альтернатива. :) – mbz

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