我在工作时遇到了node.js脚本的问题(总的来说,我对node很陌生)。当我通过forEach循环运行时,似乎它可能异步运行,因此没有运行问题。但是,当我查看软件包文档时,没有发现有关使sql执行同步运行的任何信息。预先感谢您的帮助!
function getLastLoginAndProviderType(jsonObj, connection){
console.log(jsonObj);
jsonObj.forEach(obj => {
console.log("Processing: " + obj["email"]);
//obj["email"], obj["first"], obj["last"], obj["eid"], obj["role"]
var sql = "select LAST_LOGGED_IN_TIME from EINV_OWNER.CONTACT where EMAIL_ADDRESS='" + obj['email'] + "'";
connection.execute(
sql, {}, { maxRows: 15 },
function(err, result) {
if (err) {
console.error("Query Error: " + err.message);
} else {
console.log("Number of rows returned: " + result.rows.length);
obj["lastLoggedIn"] = "null";
obj["supplierOrProvider"] = "null";
}
});
});
脚本运行时,我希望看到类似的东西:
Processing: XXX@XXX.com
Number of rows returned: XX
Processing: XXX@XXX.com
Number of rows returned: XX
...
Processing: XXX@XXX.com
Number of rows returned: XX
但是,我最终得到的是:
Processing: XXX@XXX.com
Processing: XXX@XXX.com
Processing: XXX@XXX.com
...
Processing: XXX@XXX.com
Query Error: NJS-003: invalid connection
Query Error: NJS-003: invalid connection
Query Error: NJS-003: invalid connection
...
Query Error: NJS-003: invalid connection
有什么想法吗?谢谢!
答案 0 :(得分:0)
快速浏览基本选项:
使用https://github.com/caolan/async之类的包来轻松管理回调的“ for循环”。 (还有其他软件包)
forEach
不等待您的回调完成,因此它们都同时运行。您还可以通过使用带有迭代器的回调来管理自己的for循环,该回调在达到最大迭代器时停止。
但是您也可以使用:
require('util').promisify
转换为node.js样式的回调函数
myFn(foo,bar,<function(err,data){}>)
承诺,然后您可以执行以下操作:
Resolve promises one after another (i.e. in sequence)?
或者您可能想要...
async function myFunction(){
for(i=0;i<jsonObj.length;i++){
try{
let result = await connection.execute(sql, {}, { maxRows: 15 })
console.log("Number of rows returned: " + result.rows.length);
obj["lastLoggedIn"] = "null";
obj["supplierOrProvider"] = "null";
}catch(e){
console.error("Query Error: " + err.message);
}
}
}