@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 <[email protected]> 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
> > [email protected]
> > .
> > To unsubscribe from this group, send email to
> > [email protected]
> > .
> > 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/prototype-scriptaculous?hl=en.