Javascript函数返回未定义的
好的,我在过去的两天里一直在努力让它发挥作用,但我不知道我做错了什么。我有一个名为“ping”的函数来进行计算,我有一个回调函数来检索计算值,但我一直得到的都是未定义的Javascript函数返回未定义的,javascript,jquery,Javascript,Jquery,好的,我在过去的两天里一直在努力让它发挥作用,但我不知道我做错了什么。我有一个名为“ping”的函数来进行计算,我有一个回调函数来检索计算值,但我一直得到的都是未定义的 var test; var p = ping('apple.com', function (num) { test = num; console.log(test); //this works, the value is displayed in the console. }); console.log("
var test;
var p = ping('apple.com', function (num) {
test = num;
console.log(test); //this works, the value is displayed in the console.
});
console.log("p: " +p); //says undefined
console.log("test: " +test); //says undefined
有人能告诉我我做错了什么吗?谢谢
编辑:
以下是ping函数:
function ping(host, pong) {
var started = new Date().getTime();
var http = new XMLHttpRequest();
http.open("GET", "http://" + host, /*async*/true);
http.onreadystatechange = function() {
if (http.readyState == 4) {
var ended = new Date().getTime();
var milliseconds = ended - started;
if (pong != null) {
pong(milliseconds);
//console.log(milliseconds);
return milliseconds;
}
}
};
try {
http.send(null);
} catch(exception) {
// this is expected
}
}
ping
是一个异步函数-这意味着回调函数“在稍后的某个时间”执行
解决方案是仅在回调事件发生后继续工作。这可能以不同的方式隐藏——例如回调、承诺和未来/可观察——但这始终是相同的过程
ping(…)
也返回未定义的(或者说,它根本不返回),这解释了为什么p
是未定义的-但这是次要的,与异步性质无关
请参见,您可以使用同步AJAX
function ping(host,pong){
var http = new XMLHttpRequest();
http.open("GET", "http://" + host, /*not async*/false);
http.send(null);
if(pong)pong(http.responseText);
return http.responseText;
};
否则,您将无法返回http.responseText
然而,这种技术并不是真正的最佳实践,因为它会导致页面上的所有其他Javascript暂停,直到请求完成。如果服务器需要很长时间才能应答,那么您的页面将没有响应。用户非常讨厌
请注意,您在尝试对另一个域执行AJAX时会出现错误,正如您在问题的代码中所示。您可以向我们展示您的ping功能吗。我打赌p没有返回任何东西看起来像是
ping()
是一种异步方法它是异步的。我怎样才能让它工作?@user3034411那么你不能从中返回值。。。他们的处理方法是使用回调函数,因为ping是一个自定义函数。我刚把它添加到帖子里。但是我可以看到“var p=ping…”函数中的值。所以我知道它在那里工作,但我看不到它在那之外。这正是一个AJAX调用。这就是XMLHttpRequest
的含义。@Asadping
方法的源代码当时是隐藏的。在任何情况下,事件源都是无关的,只有[a]同步性才是讨论的重点。这正是我想要做的!非常感谢。
function ping(host,pong){
var http = new XMLHttpRequest();
http.open("GET", "http://" + host, /*not async*/false);
http.send(null);
if(pong)pong(http.responseText);
return http.responseText;
};