在javascript中异步执行同步工作
有没有办法到达以下地点 我需要调用在客户端上同步执行的ActiveX方法。如果这个调用需要很长时间才能完成,那么问题就开始了,因此我希望在等待这个方法返回的响应时终止,但不是ActiveX方法本身,因为它是第三方组件,没有这样的功能 另一个问题是,我在开发环境中没有ActiveX,只有在生产环境中,所以我模拟使用一个简单的同步请求调用该方法到httphandler asp.net通用处理程序,该处理程序保持线程10秒,然后返回如下结果:在javascript中异步执行同步工作,javascript,asp.net,activex,Javascript,Asp.net,Activex,有没有办法到达以下地点 我需要调用在客户端上同步执行的ActiveX方法。如果这个调用需要很长时间才能完成,那么问题就开始了,因此我希望在等待这个方法返回的响应时终止,但不是ActiveX方法本身,因为它是第三方组件,没有这样的功能 另一个问题是,我在开发环境中没有ActiveX,只有在生产环境中,所以我模拟使用一个简单的同步请求调用该方法到httphandler asp.net通用处理程序,该处理程序保持线程10秒,然后返回如下结果: public void ProcessRequest(Ht
public void ProcessRequest(HttpContext context)
{
int interval = 10;
try
{
interval = int.Parse(context.Request["interval"]);
}
catch
{
}
Thread.Sleep(interval * 1000);
context.Response.Write("+OK");
}
所以,当我说“尝试调用ActiveX方法”时,我的意思是“我对服务器进行了同步调用,10秒后它会给我一个响应”
以下是我已经尝试过的东西
1由于JavaScript不支持多线程,我尝试先异步调用一些伪url,然后在异步接收到响应后,尝试调用ActiveX方法。这里的问题是,一旦浏览器调用该方法,整个页面就会变得无响应。代码如下:
$.ajax({
url:'../test/ThreadSleep.ashx',
async:true,
data:{ interval: 2 },
success: function(response){
// here is the actual simulation of the ActiveX method call
$.ajax({
url:'../test/ThreadSleep.ashx',
async:false,
data:{ interval: 15 },
success: function(response){
console.log(response);
alphaActiveX.xml = getAlphaXml();
}
});
}
})
2第二种解决方案是尝试在iframe中打开另一个页面。此页面将进行ActiveX调用,由于调用将在不同的页面上进行,因此我的主页应保持响应。这也不起作用。一旦iframe页面发出调用,主页就会变得无响应
以下是打开页面的javascript:
$对话框{
宽度:300,
身高:200,
莫代尔:是的,
标题:“调用ActiveX组件”,
按钮:[
{
正文:'关闭',
单击:函数{
$this.dialog'close'
}
}
],
关闭:功能{
$this.dialog'destroy';
}
};
下面是在dom ready页面上运行的javascript代码:
$(function() {
if (window.location.href.indexOf('completed=1') == -1) {
//console.log(response);
setTimeout(function() {
$.ajax({
url: 'ThreadSleep.ashx',
async: false,
data: { interval: 15 },
success: function(response) {
//console.log(response);
//alphaActiveX.xml = getAlphaXml();
window.location.href = 'iframeActiveX.aspx?completed=1'
}
});
}, 1000);
}
});
我试着用window.open调用这个页面,我想,既然这是一个新页面,也许我的页面会保持响应,但我错了
4如果我尝试在一个全新的浏览器窗口中打开此页面,也会发生同样的情况,如:
$('<div><a href="../test/iframeActiveX.aspx" target="_blank">Call the ActiveX component</a></div>').dialog({
width:300,
height:200,
modal:true,
title:'Calling ActiveX component',
buttons:[
{
text:'Close',
click:function(){
$(this).dialog('close')
}
}
],
close: function(){
$(this).dialog('destroy');
}
});
任何帮助都将不胜感激
谢谢