简体   繁体   English

从for循环返回数据

[英]returning data from for loop

i am using socket.io to fetch data about a user using his uid when you run this function 运行此功能时,我正在使用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
            };
}

and it does this on the server side 它在服务器端执行此操作

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

but when i do console.log(getUserData(uid)) i get undefined but i do get the object from the first callback what am i doing wrong here? 但是当我执行console.log(getUserData(uid))我未定义,但是我确实从第一个回调中获取了对象,我在这里做错了什么?

The callback from .emit() is asynchronous. .emit()的回调是异步的。 That means it happens sometime LATER, long after your getUserData() function has already returned. 这意味着它会在您的getUserData()函数返回后很久以后发生。 That means you have to communicate back the result using either a callback or a promise. 这意味着您必须使用回调或Promise返回结果。 In addition, it makes no sense that you're trying to iterate an array and return one result. 另外,您试图迭代一个数组并返回一个结果没有任何意义。 You should either return all the results or pick one particular item from the array as your final value. 您应该返回所有结果,或者从数组中选择一个特定的项目作为最终值。 This resolves with the whole array of data, letting the caller decide which one they want to pick from the array. 这样就解决了整个数据数组,使调用者可以决定要从数组中选择哪一个。

Here's how you could do so with a promise: 兑现承诺的方法如下:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM