返回首页


在这篇文章中,我要看看jQuery的递延和微软反应的扩展,并提供代码将转换两者之间的相似之处。虽然递延和Rx有巨大差异,也有一些相似之处,不妨利用。对于那些没有事先了解这两种技术的,我将简要介绍的基础。jQuery的递延
jQuery的递延概念是一个非常简单的。当您要执行异步操作,如Ajax请求或动画,时,你可以得到一个同步响应,这是一个Deferred对象。这对象只是表示异步操作的状态。
一做这个Deferred对象?那么,几件事情:注册时异步操作完成(Deferred对象是"解决NBSP的通知了吗??;Deferred对象合并成一个单一的递延对象执行特定操作时完成收到通知做一些特殊的异步操作期间发生错误时
一个典型的递延代码片段可能看起来像以下,在这里我们做一个Ajax请求完成时:

var deferred = $.ajax("hello.html");

deferred.complete(function(result){

	//This function is called when the request is complete

});

请注意,这仅适用于1.5到jQuery??它是第一个版本,包括递延,和Ajax功能已被修改,返回一个Deferred对象。
您也可以创建一个自定义的东西异步Deferred对象一样,例如一个动画: {C}微软接收
无扩展是一个更大的图书馆,它带来了整个新的编程方法??"反应??编程。这是围绕观察到的项目来源的想法,而不是一个可枚举源。因此,我们的反应中,而不是要求之一集合到一个新的项目??观察到的是一个"推??集合,而不是传统的Enumerable的"拉??集合。我可以总结的主要特点如下:倾听能力的事件源(可观察到的)??可以,但不限制,实际发生的事件过滤能力,可观察使用LINQ的语法能够修改中观察到的项目,例如,选择一个事件参数的特殊属性合并成一个单一来源的来源 观察到的源和反应项目时收到上述处理过程中发生的处理错误的,因为他们
下面是一个Rx的代码样本一块。这三个事件侦听??鼠标按下,鼠标移动和鼠标,将它们结合起来使用LINQ的选择器来产生一个事件的"复合??流??代表移动鼠标,鼠标之间出现下降和鼠标。然后,我们通过绘制简单的线条的反应。
var canvas = document.getElementById("rxCanvas");

 

//Transform the mouse move event into an observable source of screen coordinates

var mouseMoveEvent = Rx.Observable.FromHtmlEvent(canvas, "mousemove");

 

//Create observable sources from the left button events

var mouseLeftButtonDown = Rx.Observable.FromHtmlEvent(canvas, "mousedown");

var mouseLeftButtonUp = Rx.Observable.FromHtmlEvent(document.body, "mouseup");

 

//Create a 'drag event', which takes the delta in mouse movements 

//when the left button is down.

var draggingEvents = mouseMoveEvent.SkipUntil(mouseLeftButtonDown)

                                   .TakeUntil(mouseLeftButtonUp)

                                   .Let(function(mm) {

                                        return mm.Zip(mm.Skip(1), function(prev, cur) {

                                            return {

                                              X2: cur.offsetX,

                                              X1: prev.offsetX,

                                              Y2: cur.offsetY,

                                              Y1: prev.offsetY

                                            };

                                        })

                                    })

                                   .Repeat();

 

var context = canvas.getContext("2d");

 

//Subscribe to the observable source and draw lines

draggingEvents.Subscribe(function(p){

	context.moveTo(p.X1,p.Y1);

	context.lineTo(p.X2,p.Y2);

	context.stroke();	

});

这里是功能强大,RX行动。对不起Internet Explorer用户??本示例使用的画布!另外,我理应属性这个例子科林发送谁;这是一个直接端口,Silverlight代码:嵌入式JavaScript没有启用,请{A}看到这个动作样本!

回答

评论会员:jwooley 时间:2012/01/27
这是一个很好的文章,比较和对比递延和RX。在您转换成递延观测量的讨论提的一件事是,它可观察到的,永远不会完成的情况并不少见。在这种情况下,您将永远不会被调用。您需要消防并重新注册在多个订阅deferreds为了克服
评论会员:乔纳森卡尔迪 时间:2012/01/27
优秀点,感谢评论和指点一下