Node.js 如何运行在循环中提取数据并在循环结束时获取数据的函数?
这就是我要做的。我的第一个函数循环遍历一个用户ID数组,并构建一个用户名数组以显示在控制台中。这是在使用node.jsNode.js 如何运行在循环中提取数据并在循环结束时获取数据的函数?,node.js,loops,Node.js,Loops,这就是我要做的。我的第一个函数循环遍历一个用户ID数组,并构建一个用户名数组以显示在控制台中。这是在使用node.js function Function1(){ for (var i = 0; i < array.length; i++){ if (array[i] !== '') { GetUserName(votelog[i]); } } console.log(array2); } }
function Function1(){
for (var i = 0; i < array.length; i++){
if (array[i] !== '') {
GetUserName(votelog[i]);
}
}
console.log(array2);
}
}
function GetUserName(userid){
client.query("SELECT `username` FROM " + config.database.tablenames.user + " WHERE `userid` = '" + userid + "'",
function selectCb(err, results, fields) {
if (err) { throw err; }
console.log(results);
console.log(fields);
client.end();
array2.push(results.username);
});
}
然而,array2是空白的。我已经看到JavaScript在调用函数时并不像C那样停止。我将如何重写此文件,使其按预期工作?免责声明;我自己不太习惯JavaScript或节点。不管怎样,我的看法是这样的:
function Function1(){
for (var i = 0; i < array.length; i++){
if (array[i] !== '') {
GetUserName(votelog[i], function(result) {
array2.push(result);
});
}
}
console.log(array2);
}
function GetUserName(userid, callback){
client.query("SELECT `username` FROM " + config.database.tablenames.user + " WHERE `userid` = '" + userid + "'",
function selectCb(err, results, fields) {
if (err) { throw err; }
console.log(results);
console.log(fields);
client.end();
callback(results.username);
});
}
对此有几个答案,正确的方法可能是不要像那样单独获取每个用户名,而是编写查询以一次返回所有用户名。如果要保留单个用户名查询,可以执行以下操作:
function Function1(){
for (var i = 0; i < array.length; i++){
if (array[i] !== '') {
GetUserName(array[i], function(result) {
array2.push(result);
// Verify that all of the results have come back
if(array2.length == array.length) {
console.log(array2);
}
});
}
}
}
function GetUserName(userid, callback){
client.query("SELECT `username` FROM " + config.database.tablenames.user + " WHERE `userid` = '" + userid + "'",
function selectCb(err, results, fields) {
if (err) { throw err; }
console.log(results);
console.log(fields);
client.end();
callback(results.username);
});
}
我添加的是对console.log回调的条件,仅当返回的用户名数等于原始数组中的用户名数时,才记录结果。表示所有查询都已完成
您还必须处理GetUserName中出现错误的情况,因为这可能导致永远不会调用console.log,前提是您计划处理错误,而不是让它使应用程序崩溃。在收到所有结果之前,这仍将调用console.logarray2。