你如何运行一个函数,在一个循环中提取数据,并在循环结束时提供数据?

这是我想要做的。 我的第一个函数循环遍历一个用户标识数组,并build立一个用户名数组,用于在控制台中显示。 这是使用node.js。

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#那样停止。 我怎么会重写这个,所以这个工作如我所料?

对此有几个答案,可能“正确的”方式是不单独获取每个用户名,而是编写查询以一次返回所有用户名。 如果您想保留个人用户名查询,您可以执行如下操作:

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

我添加的是callback到console.log的条件,只有当返回的用户名数等于原始数组中的userid数时才返回结果。 这表示所有查询都已完成。

您还必须处理GetUserName中存在错误的情况,因为这可能会导致console.log()永远不会被调用,假设您正在计划处理错误,而不是让它崩溃应用程序。

免责声明; 我自己并不是很习惯JavaScript(或Node)。 无论如何,我的采取是这样的事情可能工作:

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