proxy函数可以解决javascript回调函数吗

(C#)AJAX(10)
函数调用完整签名
&&&&& Invoke(arg1,…,argN,onSucceeded,onFailed,userContext)
&&&&&&注:Invoke:调用AJAX的JS方法;
&&&&&& arg1……argN为函数传递的所有参数;
&&&&&& onSucceeded:为执行成功后的回调函数;
&&&&&& onFailed:为执行失败后的回调函数;
&&&&&& userContext:可用用于在执行函数和回调函数间传递参数,为任意类型;
回调函数完整签名
&&&&&& onSucceeded(result,userContext,methodName);
&&&&&& 注:onSucceeded:执行成功后的回调函数;
&&&&&&&&&&&&& Result:服务器返回的值;
&&&&&&&&&&&&& userContext:执行函数传入的userContext变量;
&&&&&&&&&&&&& methodName:执行函数的函数名称;
&&&&&& onFailed(error,userContext,methodName);
&&&&&&& 注:onFailed:为执行失败调用的回调函数;
&&&&&&&&error:错误处理类的一个实例,存储的为出错信息;
&&&&&&& userContext:执行函数传入的userContext变量;
&&&&&&& methodName:执行函数的函数名称;
WebService级别默认属性
&&&&&& 注:设置此属性后可不必在执行函数的方法体内再次标明
&&&&&& timeout;//默认超时时间,值小于0表示不限时间
&&&&&& defaultUserContext;//设置默认的userContext;
&&&&&& defaultSucceededCallback;//设置默认成功的回调函数;
&&&&&& defaultFailedCallback;//设置默认失败的回调函数;
-------------------------------------------------------------------------------------------------------------------------------------------
&asp:ScriptManager ID=&ScriptManager1& runat=&server&&
&Services&
&asp:ServiceReference Path=&ErrorHandling.asmx& /&
&/Services&
&/asp:ScriptManager&
&input type=&button& value=&getDivision& onclick=&getDivision(5, 0)& /&
&input type=&button& value=&timeout& onclick=&timeout()& /&
&script language=&javascript& type=&text/javascript&&
ErrorHandling.set_defaultFailedCallback(failedCallback);//设置默认处理失败回调函数
ErrorHandling.set_timeout(2000);//设置默认超时时间
function getDivision(a, b)
ErrorHandling.GetDivision(a, b);
function timeout()
ErrorHandling.Timeout();
function failedCallback(error, userContext, methodName)
var message = String.format(
&Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}&,
error.get_timedOut(),
error.get_message(),
error.get_exceptionType(),
error.get_stackTrace());
alert(&Error at & + methodName + &\n\n& + message);
ErrorHandling.asmx页面代码
&%@ WebService Language=&C#& Class=&ErrorHandling& %&
using System.W
using System.Web.S
using System.Web.Services.P
using System.Web.Script.S
using System.T
[WebService(Namespace = &http://tempuri.org/&)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ErrorHandling
: System.Web.Services.WebService
[WebMethod]
public int GetDivision(int a, int b)
return a /
[WebMethod]
public int Timeout()
Thread.Sleep(5000);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:77985次
积分:1069
积分:1069
排名:千里之外
译文:47篇
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'代理orientationchange事件回调函数
&我们在开发Web
App时,通常会遇到一些兼容性问题,orientationchange事件就是其中之一。严格来说,并不是orientationchange有兼容问题,而是触发orientationchange事件回调函数时有兼容问题(很绕口啊)。具体表现在回调函数中获取windows.innerWidth与windows.innerHeight属性上的差异。&
在safari下,对orientationchange支持很好,当orientationchange触发回调时,使用windows.innerWidth能或立刻获取到最新的屏幕高宽。&
而在Android浏览器下,需要延迟一定的时间,才能获取到正确的屏幕高宽。如果触发回调函数时,立刻使用windows.innerWidth,那么,只能取到方向未改变之前的高宽,在Android下使用下面的一个简单试验可以得出结果:&
"text/javascript"&&&
alert(windows.innerWidth);&//&默认竖屏状态,得到屏宽480&&
window.addEventListener('orientationchange',&function()&{&&
&&&&alert(windows.innerWidth);&//&触发orientationchange回调时,得到屏宽还是480&&
&&&&setTimeout(function()&{&&
&&&&&&&&alert(windows.innerWidth);&//&延迟300ms,才能得到正确屏宽960px&&
&&&&},&300);&&
},&false);&&
对于orientationchange的兼容问题,使用proxy函数是很好的一种方法,下面是我给出的一种解决方案:&
"text/javascript"&&&
//我的代码库默认依赖了Zepto框架,所以会有Zepto的接口&&
function&createOrientationChangeProxy(fn,&scope)&{&&
&&&&return&function()&{&&
&&&&&&&&&&
&&&&&&&&clearTimeout(scope.orientationChangedTimeout);&&
&&&&&&&&var&args&=&Array.prototype.slice.call(arguments,&0);&&
&&&&&&&&scope.orientationChangedTimeout&=&setTimeout($.proxy(function()&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&var&ori&=&window.&&
&&&&&&&&&&&&if&(ori&!=&scope.lastOrientation)&{&&
&&&&&&&&&&&&&&&&fn.apply(scope,&args);&//&这里才是真正执行回调函数&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&scope.lastOrientation&=&&&
&&&&&&&&},&scope),&$.os.android&?&300&:&0);&&
window.addEventListener('orientationchange',&createOrientationChangeProxy(function()&{&&
&&&&alert(windows.innerWidth);&//&无论是Safari还是Android浏览器都能正确的输出屏宽&&
},&window),&false);&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&345人阅读&&&
& & & & 众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。
& & & & 通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。
& & & & 在一次偶然的机会下,看到了一种方法可以简单的实现回调非静态成员函数,其原理就是把要调用该成员函数的对象实例赋值给一个变量,然后通过该变量来调用成员函数。把逻辑整理了一下,然后写了一个简单的回调代理类,通过这个类,可以简单的实现非静态函数的回调。
CallbackProxy.h
#ifndef&__CALLBACK_PROXY_H__&&
#define&__CALLBACK_PROXY_H__&&
template&typename&Tobject,&typename&Tparam&&&
class&CCallbackProxy&&
&&&&typedef&void&(Tobject::*CbFun)(Tparam*);&&
&&&&void&Set(Tobject&*pInstance,&CbFun&pFun);&&
&&&&bool&Exec(Tparam*&pParam);&&
private:&&&&&&
&&&&CbFun&&&&&&&pCbF&&&&&&&
&&&&Tobject*&&&&m_pI&&&&&&
template&typename&Tobject,&typename&Tparam&&&
void&CCallbackProxy&Tobject,&Tparam&::Set(Tobject&*pInstance&,&CbFun&pFun)&&
&&&&m_pInstance&=&pI&&&
&&&&pCbFun&=&pF&&
template&typename&Tobject,&typename&Tparam&&&
bool&CCallbackProxy&Tobject,&Tparam&::Exec(Tparam*&pParam)&&
&&&&(m_pInstance-&*pCbFun)(pParam);&&
&&&&return&true;&&
下面演示下如何使用该类
#include&"CallbackProxy.h"&&
class&CTest&&
&&&&CTest(int&nNum);&&
&&&&void&CbPrintSum(int&*pnAddNum){printf("The&Sum&is&%d\n",&m_nSum+*pnAddNum);};&&
private:&&
&&&&int&m_nS&&
int&main(int&argc,&&char*&argv[])&&
&&&&CCallbackProxy&CTest,&int&&CbP&&
&&&&CTest&TestInstance(20);&&
&&&&CbProxy.Set(&TestInstance,&&CTest::CbPrintSum);&&
&&&&int&nNum&=&1000;&&
&&&&CbProxy.Exec(&nNum);&&
&&&&return&0;&&
CTest::CTest(int&nNum):&&
m_nSum(nNum)&&
阅读(...) 评论() &22:04 提问
关于IOS协议代理方法自动调用问题?
各位大牛好,
想问一个关于IOS协议代理的问题:
是否通过遵守某个协议,实现了其中的方法,对于这些方法来说,大多数情况下是
视图对象对其进行自动调用的吗?
例如:当表格不知道自己的行高,就去找实现了相关方法的代理?找它实现的相关方法
来自动获得行高?
小弟不太理解代理与协议方面的知识,希望可以有大牛解答,谢谢。
按赞数排序
你理解的不错,的确是这样,但是少了一步。除了遵守协议,实现方法之外,还要把自身设置成被委托对象。。。。.delegate =self
....。少了这一步就不会自动调用这些方法了。好好理解一下委托的原理吧。
你要明白谁去调用协议方法,谁去实现协议方法。如果你说的是tableview的话。那协议方法是设置cell的行高的。如果你要用[self.delegate tableView heightForRowAtIndexPath:]来获取行高的话是不现实的。你可打印cell的高度来获取行高
我写了代理方法,也挂上了代理,但是代理方法还是不会走,是什么个问题
在线等大牛解答~~!!!!!!!
你要明白谁去调用协议方法,谁去实现协议方法。如果你说的是tableview的话。那协议方法是设置cell的行高的。如果你要用[self.delegate tableView heightForRowAtIndexPath:]来获取行高的话是不现实的。你可打印cell的高度来获取行高
我写了代理方法,也挂上了代理,但是代理方法还是不会走,是什么个问题
其他相关推荐
其他相似问题一、动态代理与静态代理的区别。(1)Proxy类的代码被固定下来,不会因为业务的逐渐庞大而庞大;(2)可以实现AOP编程,这是静态代理无法实现的;(3)解耦,如果用在web业务下,可以实现数据层和业务层的分离。(4)动态代理的优势就是实现无侵入式的代码扩展。 静态代理这个模式本身有个大问题,如果类方法数量越来越多的时候,代理类的代码量是十分庞大的。所以引入动态代理来解决此类问题
& & 二、动态代理
& & Java中动态代理的实现,关键就是这两个东西:Proxy、InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的。
& & 首先,invoke方法的完整形式如下:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
method.invoke(obj, args);
& & 首先猜测一下,method是调用的方法,即需要执行的方法;args是方法的参数;proxy,这个参数是什么?以上invoke()方法的实现即是比较标准的形式,我们看到,这里并没有用到proxy参数。查看JDK文档中Proxy的说明,如下:
& & Java代码
A method invocation on a proxy instance through one of its proxy interfaces will be dispatched to the invoke method of the instance's invocation handler, passing the proxy instance,a java.lang.reflect.Method object identifying the method that was invoked, and an array of type Object containing the arguments.
& & 由此可以知道以上的猜测是正确的,同时也知道,proxy参数传递的即是代理类的实例。
& & 为了方便说明,这里写一个简单的例子来实现动态代理。
& & Java代码
//抽象角色(动态代理只能代理接口)
public interface Subject {
public void request();
& & Java代码
//真实角色:实现了Subject的request()方法
public class RealSubject implements Subject{
public void request(){
System.out.println("From real subject.");
& & Java代码
//实现了InvocationHandler
public class DynamicSubject implements InvocationHandler
private O//这是动态代理的好处,被封装的对象是Object类型,接受任意类型的对象
public DynamicSubject()
10. public DynamicSubject(Object obj)
12. this.obj =
15. //这个方法不是我们显示的去调用
16. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
18. System.out.println("before calling " + method);
20. method.invoke(obj, args);
22. System.out.println("after calling " + method);
& & Java代码
//客户端:生成代理实例,并调用了request()方法
public class Client {
public static void main(String[] args) throws Throwable{
// TODO Auto-generated method stub
Subject rs=new RealSubject();//这里指定被代理类
InvocationHandler ds=new DynamicSubject(rs);
Classcls=rs.getClass();
11. //以下是一次性生成代理
13. Subject subject=(Subject) Proxy.newProxyInstance(
14. cls.getClassLoader(),cls.getInterfaces(), ds);
16. //这里可以通过运行结果证明subject是Proxy的一个实例,这个实例实现了Subject接口
17. System.out.println(subject instanceof Proxy);
19. //这里可以看出subject的Class类是$Proxy0,这个$Proxy0类继承了Proxy,实现了Subject接口
20. System.out.println("subject的Class类是:"+subject.getClass().toString());
22. System.out.print("subject中的属性有:");
24. Field[] field=subject.getClass().getDeclaredFields();
25. for(Field f:field){
26. System.out.print(f.getName()+", ");
29. System.out.print("\n"+"subject中的方法有:");
31. Method[] method=subject.getClass().getDeclaredMethods();
33. for(Method m:method){
34. System.out.print(m.getName()+", ");
37. System.out.println("\n"+"subject的父类是:"+subject.getClass().getSuperclass());
39. System.out.print("\n"+"subject实现的接口是:");
41. Class[] interfaces=subject.getClass().getInterfaces();
43. for(Classi:interfaces){
44. System.out.print(i.getName()+", ");
47. System.out.println("\n\n"+"运行结果为:");
48. subject.request();
& & Xml代码
运行结果如下:此处省略了包名,***代替
subject的Class类是:class $Proxy0
subject中的属性有:m1, m3, m0, m2,
subject中的方法有:request, hashCode, equals, toString,
subject的父类是:class java.lang.reflect.Proxy
subject实现的接口是:cn.edu.ustc.dynamicproxy.Subject,
运行结果为:
10. before calling public abstract void ***.Subject.request()
11. From real subject.
12. after calling public abstract void ***.Subject.request()
& & PS:这个结果的信息非常重要,至少对我来说。因为我在动态代理犯晕的根源就在于将上面的subject.request()理解错了,至少是被表面所迷惑,没有发现这个subject和Proxy之间的联系,一度纠结于最后调用的这个request()是怎么和invoke()联系上的,而invoke又是怎么知道request存在的。其实上面的true和class $Proxy0就能解决很多的疑问,再加上下面将要说的$Proxy0的源码,完全可以解决动态代理的疑惑了。
& & 从以上代码和结果可以看出,我们并没有显示的调用invoke()方法,但是这个方法确实执行了。下面就整个的过程进行分析一下:
& & 从Client中的代码看,可以从newProxyInstance这个方法作为突破口,我们先来看一下Proxy类中newProxyInstance方法的源代码:
& & Java代码
public static Object newProxyInstance(ClassLoader loader,
Class[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
if (h == null) {
throw new NullPointerException();
11. * Look up or generate the designated proxy class.
13. Class cl = getProxyClass(loader, interfaces);
16. * Invoke its constructor with the designated invocation handler.
20. * Proxy源码开始有这样的定义:
21. * private final static Class[] constructorParams = { InvocationHandler.class };
22. * cons即是形参为InvocationHandler类型的构造方法
24. Constructor cons = cl.getConstructor(constructorParams);
25. return (Object) cons.newInstance(new Object[] { h });
26. } catch (NoSuchMethodException e) {
27. throw new InternalError(e.toString());
28. } catch (IllegalAccessException e) {
29. throw new InternalError(e.toString());
30. } catch (InstantiationException e) {
31. throw new InternalError(e.toString());
32. } catch (InvocationTargetException e) {
33. throw new InternalError(e.toString());
& & Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)做了以下几件事.
& & (1)根据参数loader和interfaces调用方法 getProxyClass(loader, interfaces)创建代理类$Proxy0.$Proxy0类 实现了interfaces的接口,并继承了Proxy类.
& & (2)实例化$Proxy0并在构造方法中把DynamicSubject传过去,接着$Proxy0调用父类Proxy的构造器,为h赋值,如下:
& & Java代码
class Proxy{
InvocationHandler h=
protected Proxy(InvocationHandler h) {
& & 来看一下这个继承了Proxy的$Proxy0的源代码:
& & Java代码
public final class $Proxy0 extends Proxy implements Subject {
private static Method m1;
private static Method m0;
private static Method m3;
private static Method m2;
m1 = Class.forName("java.lang.Object").getMethod("equals",
10. new Class[] { Class.forName("java.lang.Object") });
12. m0 = Class.forName("java.lang.Object").getMethod("hashCode",
13. new Class[0]);
15. m3 = Class.forName("***.RealSubject").getMethod("request",
16. new Class[0]);
18. m2 = Class.forName("java.lang.Object").getMethod("toString",
19. new Class[0]);
21. } catch (NoSuchMethodException nosuchmethodexception) {
22. throw new NoSuchMethodError(nosuchmethodexception.getMessage());
23. } catch (ClassNotFoundException classnotfoundexception) {
24. throw new NoClassDefFoundError(classnotfoundexception.getMessage());
26. } //static
28. public $Proxy0(InvocationHandler invocationhandler) {
29. super(invocationhandler);
32. @Override
33. public final boolean equals(Object obj) {
35. return ((Boolean) super.h.invoke(this, m1, new Object[] { obj })) .booleanValue();
36. } catch (Throwable throwable) {
37. throw new UndeclaredThrowableException(throwable);
41. @Override
42. public final int hashCode() {
44. return ((Integer) super.h.invoke(this, m0, null)).intValue();
45. } catch (Throwable throwable) {
46. throw new UndeclaredThrowableException(throwable);
50. public final void request() {
52. super.h.invoke(this, m3, null);
54. } catch (Error e) {
55. } catch (Throwable throwable) {
56. throw new UndeclaredThrowableException(throwable);
60. @Override
61. public final String toString() {
63. return (String) super.h.invoke(this, m2, null);
64. } catch (Throwable throwable) {
65. throw new UndeclaredThrowableException(throwable);
& & 接着把得到的$Proxy0实例强制转换成Subject,并将引用赋给subject。当执行subject.request()方法时,就调用了$Proxy0类中的request()方法,进而调用父类Proxy中的h的invoke()方法.即InvocationHandler.invoke()。
& & PS:1、需要说明的一点是,Proxy类中getProxyClass方法返回的是Proxy的Class类。之所以说明,是因为我一开始犯了个低级错误,以为返回的是&被代理类的Class类&- -!推荐看一下getProxyClass的源码,很长=。=
& & 2、从$Proxy0的源码可以看出,动态代理类不仅代理了显示定义的接口中的方法,而且还代理了java的根类Object中的继承而来的equals()、hashcode()、toString()这三个方法,并且仅此三个方法。
& & Q:到现在为止,还有一个疑问,invoke方法中的第一个参数是Proxy的实例(准确说,最终用到的是$Proxy0的实例),但是有什么用呢?或者说,程序内是怎样显示出作用的?
& & A:就本人目前的水平看来,这个proxy参数并没有什么作用,在整个动态代理机制中,并没有用到InvocationHandler中invoke方法的proxy参数。而传入的这个参数实际是代理类的一个实例。我想可能是为了让程序员在invoke方法中使用反射来获取关于代理类的一些信息吧。
阅读(...) 评论()

我要回帖

更多关于 javascript回调函数 的文章

 

随机推荐