在Silverlight项目中调用异步JavaScript代码

时间:2011-03-03 21:26:17

标签: javascript silverlight

我们使用Silverlight作为Web界面的解决方案。我们有一个现有的Web服务,但将crossdomain和clientaccesspolicy文件放在服务器的根目录是我们的最后手段,所以我们首先探索其他选项。我已经决定了另一种方法是使用HtmlPage.Window.Invoke()并使用javascript调用webservice,接收JSON数据,并将其返回到Silverlight环境,我会相应地解析它。我遇到了两个问题:

如果我同步调用它,我的UI线程会冻结,直到调用完成,我不知道如何解决它。我的印象是UI线程是唯一可以访问javascript的线程。

如果我异步调用它,我不知道如何在readyState == 4之前返回数据。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

以下是应该在大多数最新浏览器上运行的基本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);
 }

在Silverlight C#中

 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.
     }));

 }