Javascript函数返回未定义的

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("

好的,我在过去的两天里一直在努力让它发挥作用,但我不知道我做错了什么。我有一个名为“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("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
的含义。@Asad
ping
方法的源代码当时是隐藏的。在任何情况下,事件源都是无关的,只有[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;
};