@Alphonso77:

> I know this has to do with variable scope...

I doubt it.  The code you've quoted will (or rather, would) create/
assign to a global variable provided `myGlobalVariable` isn't declared
as a var within some containing function, which I assume it isn't.

A couple of thoughts:

1. Bug - typo?

There's a bug in the quoted code:

function stakeholderModel(strDataNeeded){
     new Ajax.Request('file_name.php'),
                                  // ^--- here
          {onSuccess: function(response) {
               globalVariable = response.responseXML
               },
          parameters: {parm1: parmValue}
     });
}

Note the closing parenthesis after your URL, which means that none of
the rest of the stuff is getting passed into the `Ajax.Request`
constructor. You should be seeing a syntax error in your debugger,
because eventually there's a syntax error (the closing parenthesis on
the }); line is unmatched.

2. If the bug above is just a typo in your post (*why* do people
retype when there's the beauty of copy and paste??), then I'm guessing
you're thinking of the ajax call as synchronous, e.g.:

   stakeholderModule(someData);
   if (myGlobalVariable == somevalue) {
       // ...
   }

That won't work, because ajax requests are *asynchronous* by default.
So `stakeholderModule` gets run, which *queues* the request, but the
request doesn't complete until some time later, long after (in
computer terms) you've already checked `myGlobalVariable`.

It's possible to make ajax requests synchronous (there's an option for
it, see the docs), but it's a very bad idea. Synchronous requests
completely lock up the UI of many browsers for the entire duration of
the request, which leads to a poor user experience.

Instead, modify your logic so that whatever you were doing after
calling `stakeholderModule` you do from the `onSuccess` function. So
instead of:

stakeHolderModule(someData);
doThis();
doThat();
doTheOther();

it's

stakeHolderModule(someData, function() {
    doThis();
    doThat();
    doTheOther();
});

...where `stakeholderModule` looks like this:

function stakeholderModel(strDataNeeded, callback){
     new Ajax.Request('file_name.php', {
         onSuccess: function(response) {
               globalVariable = response.responseXML;
               callback();
         },
         parameters: {parm1: parmValue}
     });
}

@Walter:

> I don't think it's enough to declare it global just by leaving off the  
> var keyword when you're already inside an anonymous function.

It is, provided the symbol isn't in scope (e.g., declared as a var)
anywhere. It's the Horror of Implicit Globals[1], and it's a very bad
idea to rely on it.

[1] http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html

HTH,
--
T.J. Crowder
Independent Software Engineer
tj / crowder software / com
www / crowder software / com

On Mar 17, 12:16 pm, Walter Lee Davis <wa...@wdstudio.com> wrote:
> Did you try defining the variable in the global scope first? Something  
> like this:
>
> var myGlobalVariable
>
> function stakeHolderModule(strDataNeeded){
>         new Ajax.Request('foo',{parameters:{bar:baz},
>                 onSuccess: function(response){
>                         myGlobalVariable = response.responseXML;
>                 }
>         });
>
> }
>
> I don't think it's enough to declare it global just by leaving off the  
> var keyword when you're already inside an anonymous function.
>
> Walter
>
> On Mar 16, 2011, at 8:30 AM, Alphonso77 wrote:
>
>
>
>
>
>
>
> > I'm trying to either return a value or set a global variable from
> > within a function run on the onSuccess event.  I've tried defining an
> > inline function and setting a global variable, returning a value, and
> > even defining a separate function that gets called.  The problem is
> > that the variable is getting erased outside of the function holding
> > the new Ajax.request object.
>
> > I know this has to do with variable scope, but I'm running out of
> > ideas on how to make the value of my response.responseXML available to
> > functions outside of the one creating the new Ajax.request.  Any help
> > you could provide would be greatly appreciated.  Here is my code:
>
> > function stakeholderModel(strDataNeeded){
> >     new Ajax.Request('file_name.php'),
> >          {onSuccess: function(response) {
> >               globalVariable = response.responseXML
> >               },
> >          parameters: {parm1: parmValue}
> >     });
> > }
>
> > --
> > You received this message because you are subscribed to the Google  
> > Groups "Prototype & script.aculo.us" group.
> > To post to this group, send email to 
> > prototype-scriptaculous@googlegroups.com
> > .
> > To unsubscribe from this group, send email to 
> > prototype-scriptaculous+unsubscr...@googlegroups.com
> > .
> > For more options, visit this group 
> > athttp://groups.google.com/group/prototype-scriptaculous?hl=en
> > .

-- 
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.

Reply via email to