Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用同步请求时,为什么需要返回请求外部的值?_Javascript_Ajax_Mootools - Fatal编程技术网

Javascript 使用同步请求时,为什么需要返回请求外部的值?

Javascript 使用同步请求时,为什么需要返回请求外部的值?,javascript,ajax,mootools,Javascript,Ajax,Mootools,我有一个关于同步请求的问题 背景:我需要在结账前立即获取用户的用户ID。如果userID为null或零,我将强制用户登录。我决定使用同步请求。我理解异步和同步请求之间的区别。但是,我不明白为什么下面的第一个代码不起作用,而第二个代码起作用 ... UserId = GetUserId(); ... function GetUserId() { var jsonRequest = new Request({url: myurl, async: false, onComplete: funct

我有一个关于同步请求的问题

背景:我需要在结账前立即获取用户的用户ID。如果userID为null或零,我将强制用户登录。我决定使用同步请求。我理解异步和同步请求之间的区别。但是,我不明白为什么下面的第一个代码不起作用,而第二个代码起作用

...
UserId = GetUserId();
...

function GetUserId()
{
  var jsonRequest = new Request({url: myurl, async: false, onComplete: function(result) {return result;}}).get();
}
当我使用上面的代码时,我得到UserId=undefined。但是,当我使用下面的代码时,它会工作

...
UserId = GetUserId();
...

function GetUserId()
{
  var resultreturned;
  var jsonRequest = new Request({url: myurl, async: false, onComplete: function(result) {resultreturned = result;}}).get();
  return resultreturned;
}
在我看来,在第一个代码中,即使我使用了async:false,处理也不会停止。在第二段代码中,它起作用

有人知道为什么吗

此外,是否有一种方法可以在不使用var resultreturned的情况下访问返回的id?我可以使用以下方式访问报税表吗

返回jsonRequest.value或jsonRequest.result或其他内容

谢谢。

第一个版本的GetUserId没有返回任何内容。就这么简单。作为完成处理程序传递的匿名函数是否返回某些内容并不重要;它的返回值被传递给某些内部mootools函数并被忽略

至于访问结果,基本XMLHttpRequest对象应该作为请求对象的xhr属性进行访问,尽管它似乎不是的一部分,而响应则可以作为xhr对象的属性进行访问。简言之,请尝试:

jsonRequest.xhr.responseText
然而,这不应该是必要的。任何同步请求都可以通过传递回调来转换为异步请求,以便在请求完成时运行。作为onComplete参数传递的函数就是一个例子。它的技术名称是,从给定点开始,非正式地说,是计算的其余部分

暂时忘记调用堆栈。假设return语句只是另一个函数。这个返回函数是一个连续函数;当调用它时,计算的其余部分就会发生。切换到异步调用的第一步是让GetUserId函数调用传入的continuation,而不是特殊的返回continuation

function GetUserId(succeed, fail)
{
  var resultreturned;
  var jsonRequest = new Request({url: myurl, async: false, onSuccess: function(result) {resultreturned = result;}, onFailure: fail}).get();
  succeed(resultreturned);
}
要完成切换,将延续传递给请求,而不是在GetUserId中调用它,并使请求异步

function GetUserId(succeed, fail)
{
  new Request({url: myurl, onSuccess: succeed, onFailure: fail}).get();
}

...
function checkoutOrLogin(userId, responseXML) {
    if (userId) {
        /* continue checkout */
    } else {
        /* display login form */
    }
}
GetUserId(checkoutOrLogin, function(xhr) {/* display error message */});

问题在于范围。在第一个示例中,您返回的值来自未指定给任何变量的无注释函数

确切地说,你为什么要使用同步请求?异步请求不起作用有什么原因吗?因为如果我使用异步请求,代码在等待用户ID返回时不会停止。系统将认为没有用户ID,并显示登录屏幕。我知道AJAX是作为一个异步进程创建的。但是在这种情况下,我认为它不能作为异步请求工作。谢谢。为什么不能在异步请求返回时使用回调来显示登录屏幕,而不是在GetUserId返回时显示?因为我在将信息保存到数据库之前立即检查userId。我只想在用户仍处于登录状态时保存。如果他不再登录,我希望他登录。这有意义吗?这并没有说明为什么需要使用同步请求,只说明在计算可以继续之前必须得到响应。当GetUserId返回时,不需要进行保存。把逻辑放在检查用户ID和保存信息或在回调中显示登录表单上,如我的回答中所述。明白了。我没有意识到我不能在onComplete函数中执行返回。我尝试了jsonRequest.xhr.responseText,它成功了。非常感谢。不幸的是,我不能投票支持你的问题,因为我没有足够的声誉…谢谢你的回答。我想关于Ajax还有很多东西需要学习…:O