none
如何等待invoke调用AJAX后返回的数据 RRS feed

  • 问题

  • 我使用invoke调用js中AJAX访问数据库得到数据

    for i as integer = 0 to 100 setp 1 
    
    dim a as string = htmlpage.window.invoke("ajaxback",i.tostring)
    
    Next
    
    

    但调式后发现,a一直为空值,可能是ajax返回数据太慢了,无法得到赋值...这里有什么比较好的办法能让invoke后等待AJAX数据返回后再继续执行?

     

    顺便问下...这个silvelight中如何做一个waiting界面,调用waiting显示后,代码也暂停执行..就好像那个Silverlight ChildWindow 弹出子窗口的效果...但childwindow界面改改比较麻烦,最好弄个xaml control方式显示,但这样代码就无法暂停运行...

     

    2010年6月27日 13:32

答案

  • 你好,

          你可以在ajax成功以后用js去调用silverlight的managed code

             if(ajaxRequest.readyState == 4){
                        var sl= document.getElementById('sl);
                        sl.Content.MyObject.xxxx =  xxxx;

         }


         http://msdn.microsoft.com/en-us/library/cc221414(VS.95).aspx

         我不是很明白“暂停代码执行”,你是指提示程序正在忙或者在读取数据让用户暂时不能进行操作吗,Silverlight Toolkit中带有一个BusyIndicator你可以看一下。

          如果真的要使代码暂停的话,你要block整个UI Thread,这样的话界面会假死。

    2010年6月30日 2:42
  • 因为silverlight与后台的通讯本质上是串行的,如果你需要得到一组数,用for当然不是一个好方法。可以一次性的读取你所需要的数据,当然要考虑性能的问题。

    在RIA WCF中invoke是可以通过事件来得到已经执行完毕的通知的。你可以写成类似以下的方法:

    假设你在RIA WCF的数据服务中定义了一个test(string aa)的方法,那你在xaml中的代码部份可以这样调用:

    yourdataservice.test("aa",(op)=>

    {

    //op是用于回调的结果,它有一个haserror的属性,说明是否调用成功,如果成功,那结果就在value属性中.

    },null)

     

     


    okokwukai
    2010年7月1日 4:07

全部回复

  • 你好,

          你可以在ajax成功以后用js去调用silverlight的managed code

             if(ajaxRequest.readyState == 4){
                        var sl= document.getElementById('sl);
                        sl.Content.MyObject.xxxx =  xxxx;

         }


         http://msdn.microsoft.com/en-us/library/cc221414(VS.95).aspx

         我不是很明白“暂停代码执行”,你是指提示程序正在忙或者在读取数据让用户暂时不能进行操作吗,Silverlight Toolkit中带有一个BusyIndicator你可以看一下。

          如果真的要使代码暂停的话,你要block整个UI Thread,这样的话界面会假死。

    2010年6月30日 2:42
  • 因为silverlight与后台的通讯本质上是串行的,如果你需要得到一组数,用for当然不是一个好方法。可以一次性的读取你所需要的数据,当然要考虑性能的问题。

    在RIA WCF中invoke是可以通过事件来得到已经执行完毕的通知的。你可以写成类似以下的方法:

    假设你在RIA WCF的数据服务中定义了一个test(string aa)的方法,那你在xaml中的代码部份可以这样调用:

    yourdataservice.test("aa",(op)=>

    {

    //op是用于回调的结果,它有一个haserror的属性,说明是否调用成功,如果成功,那结果就在value属性中.

    },null)

     

     


    okokwukai
    2010年7月1日 4:07