2016-07-06 137 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); 
    }); 

});