Обратный звонок в JavaScript не работает для меня? - PullRequest
0 голосов
/ 10 апреля 2019

Я в последнее время разрабатываю с JS (да, я все еще новичок), и мне было интересно о 2 вещах?

1-я вещь:

я обнаружилчто он не ждет возврата из функции, которую он перемещает непосредственно к следующей инструкции, так что мне было интересно, был ли JS многопоточным?

И после некоторого исследования я обнаружил, что он управляется событиями, что я полностьюне понимаю, если это не многопоточность, то как эти вызываемые события заставляют js работать так, что я имею в виду игнорирование функции и продвижение до тех пор, пока результат не будет вычислен и возвращен?

2nd Thing:

И я слышал о обратных вызовах, которые якобы могут быть использованы для предотвращения запуска кода js до тех пор, пока не будет выполнена определенная функция, поэтому я попробовал это, и это не сработало так хорошо, вот что я сделал:

index.html

<!DOCTYPE html>
<html>
<body>
    <script>

        var j = "Nothing to show";

        function show() {
            console.log(j);
        }

        function dosome(callback) {
            var xhr = new XMLHttpRequest();

            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        j = xhr.response;
                    } else
                        alert(xhr.status + " : " + xhr.statusText);
                }
            }

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

            callback();
        }

        dosome(function(){show();});

    </script>
</body>

</html>

index.php

<?php
   sleep(2);
   echo "new Value";
?>

и вывод всегда одинаковый, он показывает "старое значение", так что я делал не так?

и спасибовы.

1 Ответ

0 голосов
/ 10 апреля 2019

Вы почти там

Во-первых, как этот код мог бы быть написан

function show(result) {
    console.log(result);
}

function dosome(callback) {
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                callback(xhr.response);
            } else
                callback(xhr.status + " : " + xhr.statusText);
        }
    }
    xhr.open("GET", "./index.php", true);
    xhr.send();
}
dosome(show);

Теперь, чтобы разбить его:

обычно обратные вызовы вызываются с некоторымиаргумент (результат асинхронного вызова)

function show(result) {
    console.log(result);
}

Во-вторых, вам нужно дождаться завершения асинхронного вызова, поэтому обратный вызов должен быть выполнен в обратном вызове onreadystatechange

xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            callback(xhr.response);
        } else
            callback(xhr.status + " : " + xhr.statusText);
    }
}

и, наконец,Вы можете сократить function() { show(); } до

dosome(show);

Когда вы передаете функцию show в функцию dosome в качестве обратного вызова

...