2016-07-06 166 views
2

我想从asycn函数的结果中创建一个全局变量_userRegister。怎么做?Javascript全局变量的异步函数?

/* 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> 
+0

所以你得到不确定的......至于它那ASYN通话.. 。你的变量只有在收到响应时才会被初始化......你能捕捉到响应吗?并且初始化那里的变量...... –

+0

这不正是它在代码中完成的吗? _userRegister = data;应该已经使其全球 – Mayday

+0

@ Mr.Noddy:我没有任何错误。我只是不能让''数据''​​变量全局重用 – Loint

回答

3

让你的函数返回一个承诺来代替。如果您需要在其他地方访问此异步值,则可以在全局范围内保存承诺。

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); 
    }) 
}); 
+0

正是这一点,我想建议 –

+0

''_userRegistering.then(功能(用户数据){ 的console.log( “_从全局变量userRegister”,用户数据); _userRegister =用户数据; })'' ''控制台。日志(_userRegister); < - underfine'' 我想将结果存储在_userRegister变量中 – Loint

+0

@ Ntlzz93你不能。那么你可以,但你不能保证价值的定义。 –

0

使用承诺是好的。

但是你也可以通过使用一个回调函数像控制执行流程试试这个:

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); 
    }); 
} 

然后

$(function() { 


    var _userRegister; 

    var socket = io(); 

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

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

});