我具有以下功能,该功能从数据库中获取结果,然后将一些结果传递给mapbox地理编码器。但是我想在其中捕获一些错误,以便当地址解析器返回该地址的空值/未定义值时,它不仅会删除该未定义值,还会删除附加到该结果的所有内容。
我正在尝试使用.splice方法删除特定的元素,虽然它检测到存在未定义的值,但是它将从数组中删除整个地址结果,而不仅仅是一个地址和所有其他结果。 (我假设如果未定义地址3,则可以删除数组中位于位置3的所有内容,因为这将是附加到该地址值的结果),
因此,如下所述
let projects = values.map(elmt => elmt[5])
我想检查从地址解析器返回的所有未定义或空值的地方吗?
功能
function grabProjects() {
sql = 'SELECT o.Name, o.Project_Type, o.sDate, o.eDate, p.Role, p.Project_Org_Address, p.Project_Org_Name,p.Country_Name, p.Country_Name, f.Funder_Name, per.Person_Name FROM project_name_table o INNER JOIN project_collaborators p ON o.Project_ID = p.Project_ID INNER JOIN project_funders f ON f.Project_ID = o.Project_ID INNER JOIN person per ON o.person_fk = per.Person_ID GROUP BY o.Project_ID LIMIT 20'
projectsArray = []
let query = conn.query(sql, (err, results) => {
if (err) throw err;
const geoPromise = param => new Promise((resolve, reject) => {
geo.geocode('mapbox.places', param, function (err, geoData) {
if (err) return reject(err);
if (geoData) {
resolve(geoData.features[0])
} else {
reject('No result found');
}
});
});
const promises = results.map(result =>
Promise.all([
result.Name,
result.Project_Type,
result.sDate,
result.eDate,
result.Role,
geoPromise(result.Project_Org_Address),
result.Project_Org_Name,
geoPromise(result.Country_Name),
result.Country_Name,
result.Funder_Name,
result.Person_Name
])
);
Promise.all(promises)
.then((values) => {
let pNames = values.map(elmt => elmt[0])
let pType = values.map(elmt => elmt[1])
let sDate = values.map(elmt => elmt[2])
let eDate = values.map(elmt => elmt[3])
let roles = values.map(elmt => elmt[4])
let projects = values.map(elmt => elmt[5])
let collabNames = values.map(elmt => elmt[6])
let countryNames = values.map(elmt => elmt[7])
let countryProjects = values.map(elmt => elmt[8])
let names = values.map(elmt => elmt[9])
let person_name = values.map(elmt => elmt[10])
projectsArray.push(pNames, pType, sDate, eDate, roles, projects, collabNames, countryNames, countryProjects, names, person_name)
console.log(projectsArray.length)
for (i = 0; i < projectsArray.length; i++) {
console.log(projectsArray[5][i])
if (projectsArray[5][i] === undefined) {
console.log('true')
projectsArray.splice(i, 1)
console.log('new length', projectsArray.length)
}
else {
console.log('false')
}
}
})
});
return projectsArray
}
答案 0 :(得分:0)
我认为可以更好地重构此代码,以实现您想要执行的操作。如我的评论所述,最好不要添加新行,除非它通过了测试。类似于:
function grabProjects() {
// ...
projectsArray = []
let query = conn.query(sql, (err, results) => {
...//
results.forEach(async (result) => {
const parsedResult = result
const address = await geoPromise(result.Project_Org_Address;
const country = await geoPromise(result.Country_Name);
result.address = address;
result.country = country;
const propUndefined = Object.keys(result).filter((key) => result[key] === undefined).length > 0;
if (!propUndefined) {
projectsArray.push(Object.keys(result).map((key) => result[key]);
}
//...
return projectsArray;
});