[mochikit] Defered.setFinal

2009-02-10 Thread Amit Mendapara
Hi Per,

I have just started again improving the MochiKit Extensions. While
creating tests for the Ajax module, I found one problem (not bug, but
specific to the feature I'm trying to implement). I registered a
callback which should be fired at the end of all registered callbacks.

I achieved by modifying Async.js with a new method `setFinal` (not
addFinal as there should be only one finalizer)  which gets fired when
`chain.length == 0`. It's simple. I would we happy if you add one such
function in MochiKit.Async.Defered...

Regards
--
Amit

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
MochiKit group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to 
mochikit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~--~~~~--~~--~--~---

Index: MochiKit/Async.js
===
--- MochiKit/Async.js	(revision 1525)
+++ MochiKit/Async.js	(working copy)
@@ -136,6 +136,11 @@
 return this;
 },
 
+setFinal: function(cb) {
+this._final = cb;
+return this;
+},
+
 _fire: function () {
 /***
 
@@ -176,6 +181,11 @@
 res = err;
 }
 }
+
+if (chain.length == 0  this._final) {
+res = this._final(res);
+}
+
 this.fired = fired;
 this.results[fired] = res;
 if (cb  this.paused) {


[mochikit] Re: Defered.setFinal

2009-02-10 Thread Per Cederberg

I think this is a good idea. I needed something similar too, so I
ended up writing an ugly hack that worked most of the time...

d.addBoth(function (res) {d.addBoth(finalFunc); return res; });

It adds new callback once the first deferred result drops in,
hopefully after all the other callbacks have been added...

But a more formally correct solution would probably be a good idea.

Cheers,

/Per

On Tue, Feb 10, 2009 at 2:30 PM, Amit Mendapara
mendapara.a...@gmail.com wrote:
 Hi Per,

 I have just started again improving the MochiKit Extensions. While
 creating tests for the Ajax module, I found one problem (not bug, but
 specific to the feature I'm trying to implement). I registered a
 callback which should be fired at the end of all registered callbacks.

 I achieved by modifying Async.js with a new method `setFinal` (not
 addFinal as there should be only one finalizer)  which gets fired when
 `chain.length == 0`. It's simple. I would we happy if you add one such
 function in MochiKit.Async.Defered...

 Regards
 --
 Amit


--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
MochiKit group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to 
mochikit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~--~~~~--~~--~--~---



[mochikit] Re: Defered.setFinal

2009-02-10 Thread Bob Ippolito

Finalizing a Deferred should ensure that no further callback/errbacks
are registered and it should attach a default error handler (success
should be no-op). The most common problem I've seen with Deferreds is
that an error occurs but nobody attached an error handler that far
down the stack. In Python they work around this by having a finalizer
so that you see the error when the object gets GC'ed, but that's not
really possible in JS since you don't have finalizers or weak
references.

On Tue, Feb 10, 2009 at 8:04 AM, Per Cederberg cederb...@gmail.com wrote:

 I think this is a good idea. I needed something similar too, so I
 ended up writing an ugly hack that worked most of the time...

d.addBoth(function (res) {d.addBoth(finalFunc); return res; });

 It adds new callback once the first deferred result drops in,
 hopefully after all the other callbacks have been added...

 But a more formally correct solution would probably be a good idea.

 Cheers,

 /Per

 On Tue, Feb 10, 2009 at 2:30 PM, Amit Mendapara
 mendapara.a...@gmail.com wrote:
 Hi Per,

 I have just started again improving the MochiKit Extensions. While
 creating tests for the Ajax module, I found one problem (not bug, but
 specific to the feature I'm trying to implement). I registered a
 callback which should be fired at the end of all registered callbacks.

 I achieved by modifying Async.js with a new method `setFinal` (not
 addFinal as there should be only one finalizer)  which gets fired when
 `chain.length == 0`. It's simple. I would we happy if you add one such
 function in MochiKit.Async.Defered...

 Regards
 --
 Amit


 


--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
MochiKit group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to 
mochikit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~--~~~~--~~--~--~---



[mochikit] Re: Defered.setFinal

2009-02-10 Thread Amit Mendapara
Per,

Your hack won't work with my case as it would mark the deferred as
`chained` so consecutive addCallback/addErrback won't work. Considering
Bob's suggestion, I modified my patch to ensure no further
callback/errbacks can be registered.

Regards
--
Amit

Bob Ippolito wrote:
 Finalizing a Deferred should ensure that no further callback/errbacks
 are registered and it should attach a default error handler (success
 should be no-op). The most common problem I've seen with Deferreds is
 that an error occurs but nobody attached an error handler that far
 down the stack. In Python they work around this by having a finalizer
 so that you see the error when the object gets GC'ed, but that's not
 really possible in JS since you don't have finalizers or weak
 references.

 On Tue, Feb 10, 2009 at 8:04 AM, Per Cederberg cederb...@gmail.com wrote:
   
 I think this is a good idea. I needed something similar too, so I
 ended up writing an ugly hack that worked most of the time...

d.addBoth(function (res) {d.addBoth(finalFunc); return res; });

 It adds new callback once the first deferred result drops in,
 hopefully after all the other callbacks have been added...

 But a more formally correct solution would probably be a good idea.

 Cheers,

 /Per

 On Tue, Feb 10, 2009 at 2:30 PM, Amit Mendapara
 mendapara.a...@gmail.com wrote:
 
 Hi Per,

 I have just started again improving the MochiKit Extensions. While
 creating tests for the Ajax module, I found one problem (not bug, but
 specific to the feature I'm trying to implement). I registered a
 callback which should be fired at the end of all registered callbacks.

 I achieved by modifying Async.js with a new method `setFinal` (not
 addFinal as there should be only one finalizer)  which gets fired when
 `chain.length == 0`. It's simple. I would we happy if you add one such
 function in MochiKit.Async.Defered...

 Regards
 --
 Amit

   

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
MochiKit group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to 
mochikit+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~--~~~~--~~--~--~---

Index: MochiKit/Async.js
===
--- MochiKit/Async.js	(revision 1525)
+++ MochiKit/Async.js	(working copy)
@@ -20,6 +20,7 @@
 this.canceller = canceller;
 this.silentlyCancelled = false;
 this.chained = false;
+this.finalized = false;
 };
 
 MochiKit.Async.Deferred.prototype = {
@@ -129,6 +130,9 @@
 if (this.chained) {
 throw new Error(Chained Deferreds can not be re-used);
 }
+if (this.finalized) {
+throw new Error(Finalized Deferreds can not be re-used);
+}
 this.chain.push([cb, eb]);
 if (this.fired = 0) {
 this._fire();
@@ -136,6 +140,11 @@
 return this;
 },
 
+setFinal: function(cb) {
+this._final = cb;
+return this;
+},
+
 _fire: function () {
 /***
 
@@ -184,6 +193,10 @@
 res.addBoth(cb);
 res.chained = true;
 }
+if (this.chain.length == 0  this._final) {
+this.finalized = true;
+this._final();
+}
 }
 };