用JavaScript回调对我不起作用?

时间:2019-04-09 23:26:04

标签: javascript callback xmlhttprequest

iv'最近一直在用js进行开发(是的,我还是一个初学者),而iv'想知道两件事吗?

第一件事:

我发现它不需要等待直接返回下一条指令的函数的返回,所以我想知道js是否是多线程的?

在进行了一些研究之后,我发现它是事件驱动的,我完全不了解它,如果不是多线程的,那么这些被称为事件的方式如何使js像那样运行,我的意思是忽略函数并继续前进,直到计算出结果并返回了?

第二件事:

我听说可能可以用来阻止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 :(得分:0)

你快到了

首先,如何编写该代码

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