2013-04-30 3 views
0

У меня есть функция, где тревога работает:Вызов функции после запроса AJAX не работает в JavaScript

function RequestNext() { 

    var xhr = getXMLHttpRequest(); 

    xhr.onreadystatechange = function() { 

     if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) { 
      MyCard = GetCard(xhr.responseText); 
      **alert(MyCard.GetNo());** 
      return MyCard; 
     } 
    }; 

    xhr.open("GET", "../../HttpRequest_Next.php" , true); 

    xhr.send(null);            
} 

Тогда у меня есть эта другая функция, где первый один вызывается, и то же самое предупреждение не работает:

function Start(){ 

    var MyCard = RequestNext(); 

    alert("Patience.js"); 
    **alert(MyCard.GetNo());** 
    alert("test2"); 
    //alert(Card.GetKind()); 
    //WriteCard(Card); 
    alert("test3"); 
} 

Для информации эти функции представлены в 2 файлах.

+1

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

+1

Функция _RequestNext() _ не имеет оператора _return_. Только ваша внутренняя анонимная функция имеет _return_. Поэтому, даже игнорируя проблему асинхронности, этот код не будет работать. – nnnnnn

+0

Я понимаю оба комментария, но я не вижу, как я могу это сделать. Есть ли способ дождаться завершения Ajax до обработки остальной части моего кода? – Pink

ответ

0

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

function RequestNext(callback) { 

    var xhr = getXMLHttpRequest(); 

    xhr.onreadystatechange = function() { 

    if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) { 
     MyCard = GetCard(xhr.responseText); 
     **alert(MyCard.GetNo());** 
     if (typeof callback=='undefined') return MyCard; 
     else { 
      return callback.call(MyCard); 
     } 
    } 
    }; 

    xhr.open("GET", "../../HttpRequest_Next.php" , true); 

    xhr.send(null);            
} 
function Start(){ 
    var MyCard = RequestNext(function() { 
     alert("Patience.js"); 
     alert(this.GetNo()); 
     alert("test2"); 
     //alert(this.GetKind()); 
     //WriteCard(this); 
     alert("test3"); 
     return this; 
    }); 
} 
+0

Спасибо, это действительно полезно !!! – Pink

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