当前位置: 首页 > 面试题库 >

如何在AJAX变量分配中添加回调

丘普松
2023-03-14
问题内容

我有一个responce通过AJAX函数分配的变量send()。当我做作业时…

responce = send();

在发送之前响应返回给了我undefined一个回音,如何添加回调以防止这种情况发生?

编辑:我要问的澄清。

它仍然返回未定义。我用send send函数在onreadystatechange函数上为变量分配变量,但是当我的代码正在执行时..
send()可以返回之前,response返回未定义状态。如何停止响应下的代码继续运行,直到分配了响应后才发送值?

编辑2:

以下代码是我的发送函数…

 function send(uri)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST",uri,true);
    xhr.onreadystatechange = function (send){
        if(xhr.readyState == 4){
            return xhr.responseText;
        }   
    }
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.send(null);
}

问题答案:

您正在以异步方式使用Ajax,但是您将其视为同步。

在执行最初的send调用后的其余代码时,异步调用将停止工作。由于代码未返回任何内容,因此您未定义。

如果查看XMLHttpRequest对象,则open方法中的第三个参数是异步标志。

open("method", "URL"[, asyncFlag[, "userName"[, "password"]]])

将其设置为true [默认关闭]将进行异步调用。将其设置为false将使其同步。

使用同步调用的问题是它将锁定用户的浏览器,直到返回调用为止。这意味着动画gif内容,浏览器计时器停止等等。如果服务器需要永远的响应,则用户将无能为力。

最好的解决方案是避免使用同步调用。使用回叫继续执行代码。

因此,根据您的修改,我将使用基本解决方案来修改我的回复

function send(uri, callback)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST",uri,true);
    xhr.onreadystatechange = function (send){
        if(xhr.readyState == 4){  //You really should check for status here because you can get 400, 500, etc
            callback(xhr.responseText);
            //return 
        }   
    }
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.send(null);
}



function myFunction(){

  var myUrl = "foo.php";

  //show a loading message or soemthing
  var someDiv = document.getElementById("loadingMessage");
  someDiv.style.display = "block";

  //Second half of your function that handles what you returned.
  function gotData( value ){
      someDiv.style.display = "none";
      alert(value);
  }

  send(myUrl, gotData);

}

如果您确实想进行同步并且不介意锁定用户的浏览器

function send(uri, callback)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST",uri,false);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.send(null);
    if(xhr.status==200){
        return xhr.responseText;
    }
    else{
        return null;
    }
}


 类似资料:
  • 我正在使用改装库,我想从OpenWeatherPi获取天气预报。 我有这个。

  • 问题内容: 我有一个具有某些值(例如10:40)的日期变量(endTime)。我需要通过向endTime添加10分钟来创建一个新变量。我该怎么做? 提前致谢 问题答案: 您可以在上使用方法: 在Javadoc中找到,花了我30秒钟。

  • 我正在学习JAVA。如果我想在列表中添加一些变量。我知道的是这样的: 如果我有很多变量呢。例如,从a到z,我是否需要像这样手动添加它? 因为我声明了100个变量,需要将它们添加到列表中。我们有其他方法可以更聪明地添加它们吗?Eclipse或Intellij中有热键吗? 感谢您的帮助。

  • @PostMapping(“/api/v1.0/{username}/forgot”)是一个公共的void forgotPassword(@PathVariable String username,@RequestBody String enteredPassword,@request body strig reenterPassword){userServiceImpl.forgotPasswo

  • 问题内容: 我在页面中有一组会话,我想使用AJAX将其删除。即,单击链接,而不必导航到新页面,只需删除会话,并在成功时显示一条消息。 现在,根据给定的答案( 对我仍然无效 ),我有以下内容: 控制者 路由: 枝条: 带有在路由,控制器和模板中找到的所有代码 控制器:PageController.php /src/Simon/TestBundle/Controller/PageController.

  • 问题内容: 这有效: 这不起作用: 为什么第二个不起作用!?我要一线。除此以外,第一个将调用函数TWICE。 如何在不调用函数两次的情况下使其成为1个衬板? 问题答案: 我看到其他人已经指出了我的旧“分配和设置”食谱,该食谱的最简单版本归结为: 但是,这主要是为了简化Python和直接在或中支持赋值的语言之间的音译。如果你有在级联这种检查和回报“数百名”,这是 多 好做一些完全不同的: 甚至像 如