在javascript中异步执行同步工作

时间:2012-06-08 09:10:10

标签: javascript asp.net activex

以下任何方式?

我需要调用一个在客户端上同步执行的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:  $( '')。对话框({                         宽度:300,                         高度:200,                         模式:真,                         标题:'调用ActiveX组件',                         纽扣:[                             {                                 文字:“关闭”,                                 点击:函数(){                                     $(本).dialog( '亲密')                                 }                             }                         ]                         close:function(){                             $(本).dialog( '摧毁');                         }                     });

这是在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');
                    }
                });

非常感谢任何帮助。

由于

0 个答案:

没有答案