【发布时间】:2020-05-17 16:42:58
【问题描述】:
我将首先提供代码,它是一个 AWS node.js Lambda 函数
const mysql = require('mysql');
const con = mysql.createConnection({
host: 'testtest.ap-southeast-2.rds.amazonaws.com',
user: 'test',
password: 'test',
database: 'test',
});
exports.handler = function(event,context,callback){
context.callbackWaitsForEmptyEventLoop = false;
var queryResult=[];
var searchbyArray = (event.searchby);
var len = searchbyArray.length;
getResult(len,searchbyArray,function(err,data){
if(err){console.log("the error is "+err);}
else{
callback(null,data);
}
});
};
function getResult(len,searchbyArray,cb){
var results=[];
for(var i=0; i<len; i++){
console.log("before loop"+i);
var sql ="SELECT * FROM aa_customer_device WHERE id LIKE '%"+searchbyArray[i]+"%'";
con.query(sql,function(err,result){
if (err){cb(err,null);}
else{
results.push(result);
}
});
}
cb(null,results);
}
在这里,cb(null, results) 在 for 循环完成之前被执行,因为 con.query(...) 是一个异步函数(猜猜这就是它的调用)并且总是在 'results 中返回一个空数组' 然后由处理程序在其回调函数中返回。
有什么办法可以在 node.js 中编写代码,使其遵循像
这样的顺序- 在 for 循环中完成所有 con.query(...) 的执行
- 将每次循环迭代的结果数组推送到“结果”数组
- 只有在上述两个步骤完成后调用 cb(null,results)
这里发生的是 cb(null, results) 在 for 循环有机会将所需信息存储在结果数组中之前执行的方式。
有什么方法可以使用 node.js 完成我想要的。有人建议我使用 Promise、async、await,但形成我阅读的所有这些解决方案并不能完全解决我的问题。
【问题讨论】:
-
for(var i=0; i
-
它的 searchbyArray.length... 我在调用 getResult() 时将 len 作为参数传递了
标签: node.js asynchronous aws-lambda