头疼的回调,请问我怎么等这个方法回调执行完再返回呢 Nodejs
头疼的回调,请问我怎么等这个方法回调执行完再返回呢 Nodejs
function getRandomName(namesList) { var realname = “”; client.get(‘userlist’, function (error, res) { var list = JSON.parse(res); var pos = Math.round(Math.random() * (list.length - 1)); var oo = list[pos]; realname = “[” + oo.user_code + “]” + oo.real_name; console.log(‘realname–’ + realname); }); return realname; };
我这个是从REDIS缓存中随机获取一个用户名字,这东西搞了我半天啦,都不知道怎么弄,真是头疼,不知道你们是怎么处理这样的问题的?
function getRandomName(namesList, callback) { var realname = “”; client.get(‘userlist’, function (error, res) { var list = JSON.parse(res); var pos = Math.round(Math.random() * (list.length - 1)); var oo = list[pos]; realname = “[” + oo.user_code + “]” + oo.real_name; return callback(realname); }); };
回调里面又肯定了个回调啊
return 是没有用的。直接嵌套写就好了。
在你的代码中,getRandomName
函数在 client.get('userlist', ...)
回调内部才设置 realname
的值。然而,这个函数在回调之前就返回了,因此 realname
还未被赋值。
为了解决这个问题,你可以使用回调函数来确保在返回结果之前完成异步操作。另外,如果你熟悉 ES6 或更高版本,也可以考虑使用 Promise 或 async/await 来简化代码逻辑。
使用回调函数的例子:
function getRandomName(namesList, callback) {
client.get('userlist', function (error, res) {
if (error) return callback(error);
var list = JSON.parse(res);
var pos = Math.round(Math.random() * (list.length - 1));
var oo = list[pos];
var realname = "[" + oo.user_code + "]" + oo.real_name;
console.log('realname--' + realname);
callback(null, realname); // 在回调中传递结果
});
}
// 调用方式
getRandomName([], function (err, name) {
if (err) return console.error(err);
console.log(name);
});
使用 Promise 的例子:
function getRandomName(namesList) {
return new Promise((resolve, reject) => {
client.get('userlist', function (error, res) {
if (error) return reject(error);
var list = JSON.parse(res);
var pos = Math.round(Math.random() * (list.length - 1));
var oo = list[pos];
var realname = "[" + oo.user_code + "]" + oo.real_name;
console.log('realname--' + realname);
resolve(realname);
});
});
}
// 调用方式
getRandomName([])
.then(name => console.log(name))
.catch(error => console.error(error));
使用 async/await 的例子:
async function getRandomName(namesList) {
const { res } = await new Promise((resolve, reject) => {
client.get('userlist', function (error, res) {
if (error) return reject(error);
resolve({ res });
});
});
var list = JSON.parse(res);
var pos = Math.round(Math.random() * (list.length - 1));
var oo = list[pos];
var realname = "[" + oo.user_code + "]" + oo.real_name;
console.log('realname--' + realname);
return realname;
}
// 调用方式
(async () => {
try {
const name = await getRandomName([]);
console.log(name);
} catch (error) {
console.error(error);
}
})();
通过这些方法,你可以确保在异步操作完成之后再返回或处理结果。