我目前在react native类中具有以下方法,但是我认为这通常适用于JS,但我可能是错的:
dbGetTemplateOptions = () => {
let dataArray = [];
let subcategories = this.state.subcategories;
subcategories.forEach(item => {
let getSubValues = new Promise(function(resolve, reject) {
resolve(item);
})
getSubValues.then((item) => this.dbGetValues(item.subCatId))
getSubValues.then((value) => console.log(2))
});
}
根据我对promise的有限js知识,在上面我解决了一个promise并运行getSubValues.then(),这意味着每个.then方法在方法返回后运行。
在上面的代码中,我调用方法dbGetValues(item.subCatId)
这是什么:
async dbGetValues(subCatId) {
let subValues = [];
let result = await db.transaction(tx => {
tx.executeSql(
'SELECT * FROM dr_template_relational '
+ ' INNER JOIN dr_report_categorie_values on dr_report_categorie_values.id = dr_template_relational.value_id'
+ ' WHERE dr_template_relational.subcategory_id = ' + subCatId + ' AND dr_template_relational.template_id = ' + this.state.currentTemplateId,
[],
(trans, result) => {
const sqLiteResults = result.rows._array;
sqLiteResults.forEach(el => {
subValues.push({ subCategoryId: subCatId, values: el.value_id, name: el.name, narrative: el.narrative });
})
});
},
(err) => console.error(err),
() => {
console.log(1);
return subValues;
}
);
return result;
}
请注意,我的console.log(2)在然后调用方法之后。 在该方法内部,还请注意我有console.log(1)。我希望它们按顺序运行,因为我在等待下一个运行之前等待它完成。我意识到我不正确,因为console.log实际上是。
2
2
1
1
答案 0 :(得分:1)
dbGetTemplateOptions = () => {
let dataArray = [];
let subcategories = this.state.subcategories;
subcategories.forEach(item => {
let getSubValues = new Promise(function(resolve, reject) {
resolve(item);
})
getSubValues.then((item) => this.dbGetValues(item.subCatId))
getSubValues.then((value) => console.log(2))
});
}
在实际调用异步dbGetValues
函数之前,您要解决承诺。这就是then
在dbGetValues
的回调之前触发的原因。
在没有更多您想要做的事情的上下文的情况下,很难知道要进行哪些更改,但是我认为您实际上可能想要这样的东西:
dbGetTemplateOptions = () => {
let dataArray = [];
let subcategories = this.state.subcategories;
subcategories.forEach(item => {
let getSubValues = new Promise(async (resolve, reject) => {
const result = await this.dbGetValues(item.subCatId)
resolve(result);
})
getSubValues.then((value) => console.log(2))
});
}
或者尝试进一步简化:
dbGetTemplateOptions = () => {
let dataArray = [];
let subcategories = this.state.subcategories;
subcategories.forEach(async (item) => {
const result = await this.dbGetValues(item.subCatId)
// Do something with result here
console.log(2)
});
}
显然,这是基于您所做的假设