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";
?>
并且输出总是相同,它显示“旧值”,所以我在做什么错了?
谢谢。
答案 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