使JavaScript中的异步事件同步
我正在使用WPF 3.5SP1 WebBrowser控件来显示包含一些javascript函数的页面。 我的程序然后需要调用一个javascript函数,它将进行异步调用。我需要一种方法将异步调用的结果返回给C#,以便我可以处理结果。使JavaScript中的异步事件同步
有没有一种方法可以让第一个javascript函数睡眠,直到发生什么事情(不锁定浏览器)?
编辑:我已经在使用回调函数 - 第2个函数实际上被称为“some-async-function-complete”。它在异步事件结束时被调用。现在我需要一种方法将结果导入到C#中。
为了进一步澄清: C#
var result = WebBrowser.InvokeScript("myscript")
的JavaScript
var result;
function myscript()
{
some-async-function();
/* what goes here? */
/* wait until result != null */
return result;
}
function some-async-function-complete(retval)
{
result = retval;
}
有没有一种办法可以让第一 javascript函数睡眠,直到 有事(与出锁定了 浏览器)?
是的 - 您可以使用异步函数,因为它打算用于:传递回调,并让它做它的事情。您应该能够将C#回调传递给您的JS函数,然后可以将其直接传递给您的异步函数,或者在需要后处理时将其包装在另一个函数中。
回调的实现的一个例子 - 这工作与的WinForms WebBrowser控件,我没有与WPF测试,但他们应该是非常相同:
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Callback
{
// allows an instance of Callback to look like a function to the script
// (allows callback() rather than forcing the script to do callback.callMe)
[System.Runtime.InteropServices.DispId(0)]
public void callMe(string url)
{
// whatever you want to happen once the async process is complete
}
}
.. 。
Callback cb = new Callback();
WebBrowser.InvokeScript("myscript", new object[] { cb })
...
function myscript(callback)
{
some_async_function(function()
{
// script-specific completion code
if (callback)
callback();
});
}
如果我读正确的问题,你正在寻找一个回调...所以...例如
function myscript()
{
some-async-function(
params, //any params you plan to use
function(result) {
//handle the result here
});
}
function some-async-function(retval,callback)
{
//assuming this really is an async function such
//as an ajax call, etc...
...
//work done, use the call back
callback(retval);
}
你可能想你的应用程序作为一个桌面应用程序。你的C#程序没有连接任何与之同步的东西。相位切换到网络模式的时间。
最接近你可以来的是有回调调用ajax与主机的另一个交换。
有没有办法让第一个javascript函数能够在睡眠中发生,直到发生什么事情(不锁定浏览器)?
在你期待它的工作方式,没有。
需要AFAIK,线程控制或连续循环 - 第一个在JavaScript中不可用,后者将锁定大多数浏览器。
我想你需要让JavaScript发送result
到带有Ajax的服务器(从some-async-function-complete
)。然后,分解您的C#以使其中一部分调用myscript
,另一部分响应并处理result
。
请参阅相关的问题:Can you wait for javascript callback?
在my answer从报价引用到这个问题:
JavaScript Strands增加协同程序和 合作线程支持的 JavaScript语言,使阻塞 能力的异步事件 回调。
多:
Narrative JavaScript是一个小 扩展JavaScript语言 ,使对 异步事件回调拦截功能。这 使异步代码更清晰 易读和易于理解。
尽管在正常情况下异步代码的行为同步在技术上是可行的,但我建议您重新考虑您的设计以采用异步方法。
你能否详细说明一下如何将C#回调传递给JS? – 2009-02-06 02:46:18
好 - 快速例子 – Shog9 2009-02-06 03:23:16
甜,这看起来像它会工作。希望WPF不会搞砸了。再次感谢。 – 2009-02-06 03:30:13