Подтвердить что ты не робот

Jquery ajax call success, как изменить глобальную переменную в функции обертки javascript?

function ajax_test(str1){ 
  var url = "None" 
  jq.ajax({
    type:'post', 
    cache: false, 
    url: 'http://....' + str1, 
    success: function(data, status, xhr){ 
      url=data; 
    }, 
    error: function (xhr, status, e) {  
    }, 
    async: true, 
    dataType: 'json' 
  }); 
  return url 
} 

Как установить глобальную переменную url как возвращаемые данные ajax для успеха?

4b9b3361

Ответ 1

В Javascript невозможно, чтобы функция return выполняла асинхронный результат. Функция обычно возвращается до того, как будет выполнен запрос AJAX.

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

Стандартный способ обойти это с помощью функции обратного вызова.

function ajax_test(str1, callback){  
   jq.ajax({ 
     //... your options
     success: function(data, status, xhr){  
       callback(data);
     }
   });  
}  

а затем вы можете вызвать его так:

ajax_test("str", function(url) {
  //do something with url
});

Ответ 2

Вот мой примерный код для извлечения данных из php, а затем передайте значение глобальной переменной javascript в функции успеха ajax. Меня устраивает!

var retVal = null; 

function ajaxCallBack(retString){
    retVal = retString;
}

function readString(filename){
    $.ajax({  
        type: "POST",  
        url: "readString.php",  
        data: { 'fn': filename },      
        success: function(response){
            ajaxCallBack(response);
        }
    }); 
}

PHP code (readString.php):

<?php

     $fn  = $_POST['fn'];

     $file = fopen("path/".$fn.".record","r");
     $string = fread($file,filesize("path/".$fn.".record"));
     fclose($file); 

     echo $string;  
?>

Однако, поскольку $.ajax() отправляет запросы асинхронно, что означает, что он может вернуться до запуска обратного вызова успеха, вы не должны полагаться на то, что он выполняется последовательно и возвращает значение самостоятельно. Поэтому здесь мы присваиваем значение ответа php глобальному значению в функции обратного вызова.