2

I want to make a global variable _userRegister from the result of asycn function. How to do that?

    /* Socket.io-client Function */

    function reportSignUp(socket, date) {
       // sent to socket server
        socket.emit('report signup', date);

       // listenning response from server 
        socket.on('users signup', function (data) {
           // data is the result from server
            console.log('user register', data);


           // make data global
           _userRegister = data;
        });
    }
    ;

    /* End Socket.io-client Function */

    $(function () {


        var _userRegister;

        var socket = io();

        var date = getDateTime(); // get current time from system

        reportSignUp(socket, date);

        console.log("_userRegister",_userRegister); // <- underfine
    });

</script>
Loint
  • 3,560
  • 7
  • 26
  • 46
  • So you getting undefined... As it s asyn call... Your variable will be initialized only when response received... Can you catch the response.. And initialize variable there... – Mr. Noddy Jul 06 '16 at 07:40
  • Isn't that exactly what its done on that code? _userRegister = data; should already make it global – Mayday Jul 06 '16 at 07:41
  • @Mr.Noddy : I haven't any error. I just can't make ``data`` variable global to reuse – Loint Jul 06 '16 at 07:41
  • Is your variable getting initialized... I mean is it getting value right? – Mr. Noddy Jul 06 '16 at 07:43
  • Possible duplicate of [How do I return the response from an asynchronous call?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – CBroe Jul 06 '16 at 07:47

2 Answers2

3

Make your function return a promise instead. If you need to access this async value somewhere else you can save promise globally as well.

function reportSignUp(socket, date) {
   var dfd = $.Deferred();
   // sent to socket server
    socket.emit('report signup', date);

   // listenning response from server 
    socket.on('users signup', function (data) {
       // data is the result from server
        console.log('user register', data);


       dfd.resolve(data);
    });

    return _userRegistering = dfd.promise();
}

/* End Socket.io-client Function */

$(function () {


    var _userRegister;

    var socket = io();

    var date = getDateTime(); // get current time from system

    reportSignUp(socket, date).then(function(userData) {
        console.log("_userRegister", userData); 
    });

    // or

    _userRegistering.then(function(userData) {
        console.log("_userRegister from global variable", userData); 
    })
});
Yury Tarabanko
  • 44,270
  • 9
  • 84
  • 98
  • Exactly this I wanted to suggest – Mr. Noddy Jul 06 '16 at 07:44
  • ``_userRegistering.then(function(userData) { console.log("_userRegister from global variable", userData); _userRegister = userData; })`` ``console.log(_userRegister ); <-- underfine`` I want to the result be stored in _userRegister variable – Loint Jul 06 '16 at 07:57
  • @Ntlzz93 You can't. Well you can but you can't guarantee the value is defined. – Yury Tarabanko Jul 06 '16 at 08:00
  • So I can't access the result on a variable, right on? – Loint Jul 06 '16 at 08:10
  • You can't guarantee the value is there. But if you save a promise globally you could always do `_userRegistering.then(function(userData) {/*safely access userData*/})`. It is quite similar to using `$(function(){/*safely access DOM*/})` to await for DOM to be ready. But here you are waiting for userData to be "ready". – Yury Tarabanko Jul 06 '16 at 08:17
  • You could also make the promise return an object, then use destructuring to pull properties out into variables. – gcampbell Jul 06 '16 at 08:38
0

Using promise is good.

But you can also try this by controlling the execution flow using a callback function like:

function reportSignUp(socket, date, onSignupCallback) {
       // sent to socket server
        socket.emit('report signup', date);

   // listenning response from server 
    socket.on('users signup', function (data) {
       // data is the result from server
        console.log('user register', data);

       // make data global
       //_userRegister = data;
       if(onSignupCallback) onSignupCallback(data);
    });
}

and then

$(function () {


    var _userRegister;

    var socket = io();

    var date = getDateTime(); // get current time from system

    reportSignUp(socket, date, function(data){
        console.log("_userRegister", userData); 
    });

});
j_k
  • 1
  • 3