当您运行此函数时,我正在使用 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/