从for循环

时间:2018-03-29 00:09:58

标签: javascript for-loop callback socket.io return

我正在使用socket.io在您运行此函数时使用其uid获取有关用户的数据

function getUserData(uid){
    "use strict"
    socket.emit('getUserData',uid, function(callback){
        console.log('callback' + callback)
        for (var i = 0; i < callback.length; i++) {
            var row = callback[i];
            var username = row.username;
            var about = row.about;
            var uid = row.uid;
        }
    })        
    return {
                username:  username,
                uid: uid,
             //   about: about
            };
}

它在服务器端执行此操作

socket.on('getUserData',function(uid, callback){
    connection.query('SELECT * FROM users WHERE uid = ?', [uid], function(err, rows) {
        callback(rows)
    })
})

但是当我做console.log(getUserData(uid))时我得到了未定义但我从第一个回调中得到了对象我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

来自.emit()的回调是异步的。这意味着它会在你的getUserData()函数返回很久之后的某个时间发生。这意味着您必须使用回调或承诺来回传结果。此外,您尝试迭代数组并返回一个结果是没有意义的。您应该返回所有结果,或者从数组中选择一个特定项作为最终值。这解决了整个数据集,让调用者决定从阵列中选择哪一个。

以下是你如何做到这一点:

function getUserData(uid){
    "use strict"
    return new Promise(resolve => {
        socket.emit('getUserData',uid, function(returnData){
            console.log('returnData', returnData)
            resolve(returnData);
        });
    });
}

// usage
getUserData(someUID).then(results => {
    // use results in here
});