问题描述
你好,我写了一条sql来从2个表中获取信息,但是当我想返回数据时,我不知道索引在正确的时机执行。我应该怎么做,有什么方法可以从第一种方法而不是每种方法中得到Json响应?
我的功能:
const searchAntibodies = (
index: number,amount: number,information: string,startDate: string,endDate: string,) => {
return new Promise<Antibodies[]>((resolve,reject) => {
let antibodies: Antibodies[] = [];
db.serialize(() => {
db.each(`SELECT id,name as antibodyName FROM Antibodies WHERE
id IN
(SELECT id FROM Antibodies WHERE name LIKE ?
UNION all
SELECT antiId FROM AssignedColors WHERE name LIKE ?
UNION all
SELECT antiId FROM AssignedReactivities WHERE name LIKE ?)
AND dateOfCreation >= ? AND dateOfCreation <= ?
ORDER BY dateOfCreation DESC LIMIT ? OFFSET ?;`,[`%${information}%`,`%${information}%`,startDate,endDate,amount,index],(err,antibody: Antibodies) => {
if (err) {
reject(err.message);
} else {
db.all('SELECT name,locations,colorId FROM AssignedColors WHERE antiId = ?',[antibody.id],colors) => {
if (err) {
reject(err.message);
} else {
antibody.colors = colors;
antibodies.push(antibody);
if (antibodies.length === 10) {
resolve(antibodies)
}
}
});
}
});
});
});
}
我的预期结果:
[ {
id: 1999,antibodyName: 'Antibody 1999',colors: [ [Object],[Object],[Object] ] },{
id: 1995,antibodyName: 'Antibody 1995',{
id: 1994,antibodyName: 'Antibody 1994',{
id: 1993,antibodyName: 'Antibody 1998',{
id: 1997,antibodyName: 'Antibody 1997',} ]
解决方法
经过大量搜索后确定找到答案。实际上,如果您没有为第一个回调函数设置类型,则可以在完成时获得第二个回调函数。 这是我的结果:
const getAntibodies = (
index: number,amount: number,startDate: number,endDate: number,orderBy: string,orderType: string,) => {
return new Promise<Antibodies[]>((resolve,reject) => {
let antibodies: Antibodies[] = [];
let totalCount: number;
let sql = 'SELECT id,name as antibodyName,dateOfCreation FROM Antibodies ';
let params = [amount,index];
if (startDate !== 0 || endDate !== 0) {
sql += `WHERE dateOfCreation >= ? AND dateOfCreation <= ?
ORDER BY ${orderBy} ${orderType} LIMIT ? OFFSET ?;`;
params.unshift(startDate,endDate);
} else {
sql += `ORDER BY ${orderBy} ${orderType} LIMIT ? OFFSET ?;`;
}
db.serialize(() => {
db.each(sql,params,async (err,antibody) => {
if (err) {
reject(err.message);
} else {
await getColors(antibody.id).then((colors) => {
antibody.colors = colors;
antibodies.push(antibody);
if (antibodies.length === totalCount) {
resolve(antibodies);
}
}).catch((err) => {
reject(err);
});
}
},(err,count) => {
if (err) {
reject(err.message)
} else {
if (count === 0) {
resolve(antibodies);
} else {
totalCount = count;
}
}
});
});
});
}
const getColors = (id: number) => {
return new Promise<Color[]>((resolve,reject) => {
db.serialize(() => {
db.all('SELECT name,locations,colorId FROM AssignedColors WHERE antiId = ?',[id],colors: Color[]) => {
if (err) {
reject(err.message)
} else {
resolve(colors);
}
});
});
});
}