在Silverlight项目中调用异步javascript代码
我们使用Silverlight作为web界面的解决方案。我们有一个现有的web服务,但将一个crossdomain和clientaccesspolicy文件放入服务器的根目录是我们最后的选择,因此我们将首先探索其他选项。我决定另一种方法是使用HtmlPage.Window.Invoke()并使用javascript调用Web服务,接收JSON数据,然后将其返回到Silverlight环境,在那里我将相应地解析它。我遇到了两个问题: 如果我同步调用它,我的UI线程将冻结,直到调用完成,我不知道如何解决它。我的印象是UI线程是唯一可以访问javascript的线程在Silverlight项目中调用异步javascript代码,javascript,silverlight,Javascript,Silverlight,我们使用Silverlight作为web界面的解决方案。我们有一个现有的web服务,但将一个crossdomain和clientaccesspolicy文件放入服务器的根目录是我们最后的选择,因此我们将首先探索其他选项。我决定另一种方法是使用HtmlPage.Window.Invoke()并使用javascript调用Web服务,接收JSON数据,然后将其返回到Silverlight环境,在那里我将相应地解析它。我遇到了两个问题: 如果我同步调用它,我的UI线程将冻结,直到调用完成,我不知道如何
如果我异步调用它,我不知道在readyState==4之前如何不返回数据。有什么想法吗?这是一个基本的
XmlHttpRequest
解决方案,应该可以在大多数最新浏览器上使用:-
Javascript:-
function getSomeJSON(url, callback)
{
var result = null;
var xhr = new XmlHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechanged = function()
{
if (xhr.readyState == 4)
{
if (xhr.status == 200)
{
result = xhr.responseText;
}
xhr = null;
callback(result);
}
}
xhr.send(null);
}
微光C#
void FetchData()
{
字符串url=GenerateUrlForService();
调用(“getSomeJSON”,新操作(jsonResult=>
{
//这里的代码用于处理json字符串结果。
//这将异步运行,因此不应阻塞UI线程
//在web服务调用期间。
}));
}
对于JSON是否有某种XML数据岛替代方案可以与IE7+、Chrome、Firefox 3+和,还有更新版本的Safari?如果您有其他问题或详细信息要添加到问题中,只需编辑您的问题,而不是对其进行评论。您能否澄清一下如何不返回数据的含义
?如果您不想手动处理请求,您也可以使用jQuery的ajax API代替XmlHttpRequest。不管怎样,我同意在处理异步请求时使用回调方法是最好的方法。
void FetchData()
{
string url = GenerateUrlForService();
HtmlPage.Window.Invoke("getSomeJSON", new Action<string>(jsonResult =>
{
// Code here to handle the json string result.
// This will run asynchronously so should not block the UI thread
// for the duration of the web service call.
}));
}