javascript - 从 for 循环返回数据

标签 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)) 时,我得到了未定义,但我确实从第一个回调中获取了对象,我在这里做错了什么?

最佳答案

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

以下是您如何通过 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
});

关于javascript - 从 for 循环返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49546088/

相关文章:

javascript - 使用 ngOptions 和 selectpickerintable 重置下拉菜单默认值

javascript - "Possibly unhandled rejection: ZERO_RESULTS" Angular 1.6.6 ng-map Geocode ui-bootstrap

r - 如何在 R 中使用 "for"循环编写矩阵?

java - GUI 类(JTextField-JTextArea)

javascript - 如何在回调中访问正确的“this”?

javascript - javascript 函数中奇怪的控制台输出数组和 array.pop()

php - tbody 不允许点击

javascript - 反向循环真的更快吗?

javascript - 主干获取()成功回调不起作用

ios - iOS 中的 OAuth2.0?