Ayende @ Rahien

Refunds available at head office

JavaScript Race Conditions

About a week ago I posted how to handle Multiple Cascadiong Drop Downs using MS Ajax. That worked, except sometimes it didn't work.

Took me a while to figure out that there was a race  condition there. Let me tell you, Javascript in the browser is not the language for tracking down threading issues. At any rate, here is the fix.

function changeOnParentChangeOnProductsToAvoidRaceConditions()

{

      var behaviors =  Sys.UI.Behavior.getBehaviors($('<%=Benefits.ClientID%>'));

      if(behaviors == null || behaviors.legth==0)

      {

            //wait for the behavior to be defined.

            setTimeout("changeOnParentChangeOnPoliciesToAvoidRaceConditions()", 10);

            return;

      }

      for( var i=0; i<behaviors.length;i++)

      {

            var behavior = behaviors[i];

            //required to get around race condition

            behavior._oldBenefitsOnParentChange = behavior._onParentChange;

            behavior._onParentChange = function()

            {

                  if( $('<%= Insurances.ClientID %>').selectedIndex == 0)

                  {

                        return;

                  }

                  behavior._oldBenefitsOnParentChange ();

            }

      }

}

Event.observe(window, 'load', function() {

      changeOnParentChangeOnProductsToAvoidRaceConditions();

}); 

Comments

Matt
05/02/2007 10:18 PM by
Matt

Uh-oh, there's another bug...

line 4:

if(behaviors == null || behaviors.legth==0)

should be:

if(behaviors == null || behaviors.length==0)

length is missing the n.

Keep up the good work, my friend.

Comments have been closed on this topic.