Javascript 为什么xmlhttprequest中的代码在async标志设置为false时有效,而在设置为true时无效

Javascript 为什么xmlhttprequest中的代码在async标志设置为false时有效,而在设置为true时无效,javascript,jquery,ajax,asynchronous,xmlhttprequest,Javascript,Jquery,Ajax,Asynchronous,Xmlhttprequest,我对javascript的使用还比较陌生,希望能得到任何帮助。 我有一个应用程序,其中浏览器必须使用xmlhttprequest从服务器接收响应true/false以进行测试,并且基于该响应,客户端将打开一个文件选择对话框,供用户选择要上载的本地文件 当我使用设置为FALSE的async标志创建XMLHttpRequest时,当客户端从服务器接收到一个true响应时,会为Chrome和IE打开一个文件选择对话框 当我创建XMLHttpRequest时,将async标志按建议设置为TRUE,当客户

我对javascript的使用还比较陌生,希望能得到任何帮助。 我有一个应用程序,其中浏览器必须使用xmlhttprequest从服务器接收响应true/false以进行测试,并且基于该响应,客户端将打开一个文件选择对话框,供用户选择要上载的本地文件

当我使用设置为FALSE的async标志创建XMLHttpRequest时,当客户端从服务器接收到一个true响应时,会为Chrome和IE打开一个文件选择对话框

当我创建XMLHttpRequest时,将async标志按建议设置为TRUE,当客户端从服务器接收到TRUE响应时,将遵循相同的代码路径,但是文件选择对话框从未打开,Chrome的调试器中也没有显示错误,但它仍然在IE中工作

代码如下:

... 
// user has clicked button to upload a file
$scope.uploadFile = function () { 
   request = new XMLHttpRequest();
   request.open("GET", "some-url", true);// false
   request.onreadystatechange = $scope.checkUploadPermissions;
   request.send();    
}

// the callback
// If the user has permission (based on various factors not shown here)
//   we open the dialog
// Otherwise we inform them that they are not allowed
$scope.checkUploadPermissions = function () {
  // simplified for brevity
  if (request.readyState == 4 && request.status == 200) {
    // for this sample, we are only checking if the server returned true/false
    var hasPerms = request.responseText;
    if (hasPerms === "true") {
       $scope.openFileSelector();
    }
    else {
       alert("You do not have permission to upload a file.");
    }
  }
}

// if the user has permission to proceed, we trigger a click on a hidden element
$scope.openFileSelector = function () {       
   angular.element("#presentUpload").trigger("click");
}
...
我想重申,当async标志设置为FALSE时,这段代码可以完美地工作,但当它设置为TRUE时,则无法工作

如何在将标志设置为TRUE时使其正常工作


提前谢谢。

文件上载是浏览器中的一项功能,通常在JS代码处理鼠标单击或键盘事件时,只能作为用户操作的直接结果启动。它不能由计时器或通过某个异步回调异步启动

因此,当您将第一个Ajax调用设置为sync时,浏览器会显示隐藏元素上的JS单击,因为它仍然在隐藏元素单击事件中,因此允许上载。当您的第一个Ajax调用设置为async时,用户单击事件在您尝试单击隐藏元素时结束,浏览器将不会显示上载对话框


有关详细信息,请参阅。

通常,当某项工作是同步的,而不是异步的时,这是因为执行路径中的某些代码错误地假设了同步执行,并且在完成回调中应该执行的某些事情没有在那里执行。angular.elementpresentUpload.triggerclick;该怎么办?您知道在异步执行ajax时是否调用openFileSelector吗?浏览器中的某些操作是不允许异步执行的,只有在处理实际用户事件的过程中才会工作。@ JoFr.00对OpenFielsExcel的调用只是一个函数,如果用户有上传文件的权限,则包含任何必要的ToDOS。调用angular.elementpresentUpload.triggerclick;只需在html页面上调用一个隐藏按钮,该按钮打开并触发点击抱歉@jfriend00被从我的办公桌上调用,并且没有完成对上一条评论的正确编辑:调用openFileSelector只是一个函数,如果用户有权上传文件,则该函数包含任何必要的TODO。调用angular.elementpresentUpload.triggerclick;只需调用html页面上的隐藏元素,该元素触发单击并打开文件上载对话框。在这两种情况下,async设置为TRUE和FALSE会命中所有代码行,只是当它为TRUE时,对话框永远不会打开。@codephreek jfriend00的答案回答了这个问题。您不能在单击事件之外执行此操作。当您执行异步操作时,您就置身于该事件之外。