以下有什么办法吗?
我需要调用一个在客户端同步执行的 ActiveX 方法。如果此调用需要很长时间才能完成,问题就开始了,因此我想终止等待此方法返回的响应,而不是 ActiveX 方法本身(因为这是第三方组件并且没有这种能力)。
另一个问题是我在开发环境中没有那个 ActiveX,只有在生产环境中,所以我模拟了一个简单的同步请求来调用该方法到一个 httphandler(asp.net 通用处理程序),它持有线程 10 秒和然后返回结果如下:
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: $('').dialog({ width:300, height:200, modal:true, title:'Calling ActiveX component', buttons:[ { text:'Close', click: function(){ $(this).dialog('close') } } ], close: function(){ $(this).dialog('destroy'); } });
这是在页面 dom 就绪上运行的 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);
}
});
3)我尝试用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');
}
});
任何帮助将不胜感激。
谢谢