Как вызвать метод обратного вызова после HTTP-запроса - PullRequest
0 голосов
/ 18 декабря 2018

Мой код выполняется внутри основной функции.Одна часть моего кода - сделать HTTP-запрос с параметром, который был определен ранее в функции, а затем записать ответ в новую переменную и работать с ней позже.

Я бы хотел исключить эти шагис HTTP-запросом вне основной функции, и просто вызовите функцию и запишите ответ в переменной.

К сожалению, я попробовал, но это не работает.

Error: variable is undefined

Myкод:

function DoWork() {
    //some code

    var strResponseHttpRequest;
    strResponseHttpRequest = HttpRequest(strInput, function(strInput) {
    console.log(strInput);
    };

    //continue working with the variable 'strResponseHttpRequest'   
    //rest of my code
}


function HttpRequest(strInput, callBackMethod) {

    var objRequest = new XMLHttpRequest(); //New request object

    objRequest.onreadystatechange = function() {

    // Waits for correct readyState && status
    if (objRequest.readyState == 4 && objRequest.status == 200) callBackMethod(objRequest.responseText)
    }

    objRequest.open("get", "php/get-content.php?ID=" + strInput, true);
    objRequest.send();
}

Надеюсь, вы поможете мне выяснить, где проблема.Если есть какой-то лучший способ сделать это, дайте мне знать.Я был бы признателен за это.Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Откуда берется ваша переменная strInput в вашей функции DoWork()?Может быть, вы забыли определить это где-то?Может быть например:

function DoWork(strInput) {
    //some code

    var strResponseHttpRequest;
    strResponseHttpRequest = HttpRequest(strInput);

    console.log(strResponseHttpRequest);

    //continue working with the variable 'strResponseHttpRequest'
    //rest of my code
}

function HttpRequest(strInput) {
    function reqListener () {
        console.log(this.responseText);
    }
    var objRequest = new XMLHttpRequest(); //New request object

    objRequest.onload = function() {
        var strResponse = this.responseText;
        return strResponse;
    };

    objRequest.open("get", "php/get-content.php?ID=" + strInput, true);
    objRequest.send();
}

DoWork("yourIDvalue");
0 голосов
/ 18 декабря 2018

Вы имеете в виду асинхронный обратный вызов?Вам нужно подождать, пока сервер вернет правильный статус и состояние ReadyState.

Измените это:

objRequest.onload = function() { var strResponse = this.responseText; return strResponse; };

На это:

objRequest.onreadystatechange = function() {

    // Waits for correct readyState && status
    if (objRequest.readyState == 4 && objRequest.status == 200) callBackMethod(objRequest.responseText);
 };`

и передать метод обратного вызова в качестве второго параметра в HttpRequest(strInput, callbackMethod) следующим образом:

strResponseHttpRequest = HttpRequest(strInput, function(responseText) {
    console.log(responseText);
});

Также добавьте callbackMethod в качестве параметра следующим образом:

HttpRequest(strInput, callbackMethod)
...