2016-03-10 4 views
1

Вы можете помочь мне с этой проблемой? В успехе: .... Я получаю результат, который мне нужен, но ajaxFunction в конце возвращает значение ''.Функция с запросом ajax

ajaxFunction = function(lastNumber){ 
 
     var json_result = ''; 
 
     $.ajax({ 
 
      type: "POST", 
 
      contentType: "application/json", 
 
      dataType: "json", 
 
      data: '{"first" : "'+lastNumber+'"}', 
 
      url: "http://localhost:8080/some_url", 
 
      success: function (result) { 
 
       console.log("in success: " + result.result); 
 
       json_result = result.result; 
 
      } 
 
     }); 
 
     console.log("before return " + json_result); 
 
     return json_result; 
 
    };

+3

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous- call) – dotnetom

+0

ajax выполняются асинхронно – madalinivascu

ответ

0

Вы можете поставить это и попытаться

ajaxFunction = function(lastNumber){ 
    var json_result = ''; 
    $.ajax({ 
     async: false, 
     type: "POST", 
     contentType: "application/json", 
     dataType: "json", 
     data: '{"first" : "'+lastNumber+'"}', 
     url: "http://localhost:8080/some_url", 
     success: function (result) { 
      console.log("in success: " + result.result); 
      json_result = result.result; 
     } 
    }); 
    console.log("before return " + json_result); 
    return json_result; 
}; 

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

Если вы не работаете с этим, вы можете использовать либо обратный вызов, либо обещание (работает и возвращается как синхронные вызовы).

+0

Я так пробовал, но async: false лишен – Maria

+1

Использование синхронных вызовов AJAX почти всегда плохая идея, поскольку она зависает от пользовательского интерфейса до получения ответа от сервера – dotnetom

1

Проблема в том, что ваш результат возвращается, а затем вызов ajax выполняется async.

Вот пример альтернативы, используя Deferred.

return value from nested function in jquery

function test(){ 
    var def = new $.Deferred(); 
    $.ajax({ 
     url: 'test', 
     success: function(data) { 
      // Do some minor logic to determine if server response was success. 
      console.log('success in callback'); 
      if(data == true){ 
       def.resolve(true); 
      } 
      else{ 
       def.reject(); 
       // or possibly def.resolve(true) depending what you're looking for. 
      } 

     }, 
     error:function(){ 
      console.log('error in callback'); 
      def.reject(); 
     } 
    }); 

    return def; 
} 

EDIT: Пример для случая:

var ajaxFunction = function(lastNumber){ 
 
    var def = new $.Deferred();   
 
     $.ajax({ 
 
      type: "POST", 
 
      contentType: "application/json", 
 
      dataType: "json", 
 
      data: '{"first" : "'+lastNumber+'"}', 
 
      url: "http://example.com", 
 
      success: function (result) { 
 
       console.log("in success: " + result.result); 
 
       def.resolve(result.result); 
 
      }, 
 
      error: function(){ 
 
      def.reject(); 
 
      } 
 
     }); 
 
     return def; 
 
    }; 
 

 
var testMethod = function(){ 
 
    var result = ajaxFunction('some number'); 
 
    result.done(function(result){ 
 
    alert(result); 
 
    console.log('done in deferred'); 
 
    // Do something when everything went well. 
 

 
    }).fail(function(){ 
 
    alert('error'); 
 
    console.log('error in deferred'); 
 
    // Do something when something went bad. 
 
    }); 
 

 
} 
 

 
testMethod();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

Привет, в этом случае он возвращает объект [object Object]. Как я могу получить значение этого объекта? Мне нужно значение, а не объект. – Maria

+0

Я отредактировал ответ с полным примером. – smoksnes

0

всегда использовать $.Deferred() объект и вернуть его в вызове Ajax.

использовать .resolve() для вашей отложенной переменной в вашем обратном вызове Ajax .

Вызовите свой метод и проверьте с помощью метода отложенной функции .done.

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