【问题标题】:Problems understanding/using callback function理解/使用回调函数的问题
【发布时间】:2014-01-03 22:11:51
【问题描述】:

this 讨论和聊天中,我了解到回调是唯一的方法!

" 从服务器获取带有 ajax 的链接,将链接写入变量中,使用此链接打开 xml,使用 xml 做一些事情:回调是唯一的方法吗? "

我试图理解什么是回调。我读了一些博客,但还是有问题。

我现在在 JS 中拥有的是

1) 打开 xml 的函数。

2) 在第一个函数中请求xml链接的函数

有人可以在 PLAIN JAVASCRIPT 中提供如何嵌套这两个函数的示例吗?

服务器生成 xml 的链接,因为我正在制作一个多用户网站,并且每个用户都有自己的 xml。所以我需要询问服务器xml的链接是什么,然后打开它。有没有简单的方法来实现这一目标?我需要纯 javascript 没有 jquery。 谢谢!

【问题讨论】:

  • “请求1中xml的链接”是什么意思?
  • 你能展示你到目前为止所做的事情吗?
  • 在第一篇文章中添加了更多信息

标签: javascript php ajax xml


【解决方案1】:

一般来说,“回调”是一个函数,将在稍后异步过程完成时执行。

因此,您可以首先定义从服务器检索数据时应该发生的函数(直观地说,是“第二个”函数,但您应该首先定义它,因为它是您希望实现的业务功能,而不是只是一个实施问题)。像这样简单的事情:

var doSomethingWithTheData = function () {
    // do, well, something with the data
};

这假设您拥有数据,而您还没有。但是 AJAX 调用将获取该数据。您现在可以将此函数用作 AJAX 调用的回调。拿着AJAX example from MDN,你可能有这个:

var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 8 and older
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
httpRequest.onreadystatechange = doSomethingWithTheData;
// perform the AJAX request

httpRequest 对象将包含 AJAX 调用执行并完成后来自服务器的响应。 (请记住,这是异步发生的,因此它不会在下一行代码中包含响应。它会在您无法控制的稍后时间出现。因此需要回调。)

我建议阅读完整的 MDN 文章以获取所有详细信息,尤其是有关处理错误等方面的详细信息。但是您要查找的数据(假设没有出错)将在httpRequest.ResponseText 中。因此,还假设您的变量的范围允许这样做(您可以根据需要进行修改):

var doSomethingWithTheData = function () {
    var data = httpRequest.ResponseText;
    // do, well, something with the data
};

【讨论】:

  • 感谢您的解释。一位用户说我不需要回调来获取 XML 文件的链接然后打开它。我不明白如果我真的需要它。我在第一篇文章中添加了更多信息。你能告诉我是否有一种简单的方法来制作我需要的东西吗?谢谢。
  • @newtphp:我认为在这种情况下,其他答案是使用稍微不同的“回调”定义。这是一种特殊的 AJAX 请求 (JSONP),它遵循用于跨域请求的特定标准。我不认为你需要那个。但我回答中的 JavaScript“回调”函数只是 AJAX 调用完成时执行的代码。
【解决方案2】:

对不起,@大卫

var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, 
   httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 8 and older
   httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
var url = "http://myserver.mydomain/getMyUsersXMLUrl?user=pete";
httpRequest.open("GET", url, true); // next ajax to retrieve XML - File
httpRequest.onreadystatechange = function() {
   if (httpRequest.readyState == 4) { // response received
      var response = httpRequest.responseText; // this should contain you url

      httpRequest.open("GET", response, true); // next ajax to retrieve XML - File
      // and the same as for the first request
   }
}

【讨论】:

    【解决方案3】:

    如果你只需要下载一个 xml 你不需要回调。看看 jquery 和 ajax 就知道了。无法从服务器检索回调。 JSONP 确实处理服务器调用的回调(实际上它们不是),但你不需要它。我认为您正在向 xhttprequestobject 发送消息

    【讨论】:

    • 服务器生成 xml 的链接,因为我正在制作一个多用户网站,每个用户都有自己的 xml。所以我需要询问服务器xml的链接是什么,然后打开它。有没有简单的方法来实现这一目标?我需要纯 javascript 没有 jquery。
    • 简单。这是两个请求,第一个为您要下载的 xml 文件检索正确的 url。
    • 问题是,如果我第一次使用 ajax 请求 URL,当我尝试打开它时,应该保存链接的变量是未定义的。
    • 这就是上面的答案中提到的。 Ajax 是异步的,因此您的 ajax 调用不会使您的代码执行停止等待调用的结果。而是继续执行程序。避免这种情况的最简单形式是检查您的 ajax 请求的状态。当它完成时,您可以检索结果然后发出 Nextel 请求。但是如果您在循环中检查状态,您的应用程序将阻塞,您将收到一条无响应的脚本消息。所以你会使用 settimeout 并检查每 1 秒 Ort 的东西
    • Puh 用 Mythen 智能手机等待完成有趣的单词。 :D
    【解决方案4】:

    callback function 只是一段可执行代码,作为参数传递给另一段代码。例如:

    function first (arr, predicate) {
        // no predicate supplied, return first element
        if (!predicate) return arr[0];
    
        for (var i = 0; i < arr.length; i++) {
            // return first element satisfying predicate
            if (predicate(arr[i])) return arr[i];
        }
    
        // no element satisfying predicate, return null
        return null;
    }
    
    // second parameter is an anonymous function
    // will alert 4, as it's the first element which will return true
    alert(first([1, 2, 3, 4, 5, 6], function(n) { return n > 3; }));
    

    回调对于异步任务或在运行时需要额外自定义的库函数很有用。

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 1970-01-01
      • 2011-10-24
      • 2019-01-29
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多