在await
函数调用结束时,我需要循环并等待修改后的结果。
等待所有执行并仅在完成循环后才返回结果的最佳选择是什么?
try {
for await (var [i, object] of tablesArchive.data.entries()) {
if (Object.keys(object).length === 0) {
continue;
}
// Busca IDs de relacoes existentes
await this.getIdByRalations(tablesArchive, object, async (newObject) => {
where = { [whereByProperty]: newObject[whereByProperty] };
// Atualiza ou cria o registro na base de dados
const registro = await this.upsertWithWhere(app, tablesArchive.modelName, where, newObject);
tablesArchive.data[i].id = registro.id;
});
}
} finally {
console.log('FINALLY ');
return tablesArchive.data;
}
在上述情况下,仅在遍历所有索引之后,才需要修改tablesArchive.data
对象,并更新信息。我想将所有修改都称为返回。
答案 0 :(得分:0)
您最终不一定完全不需要。您对await的使用已经使代码“等待”,直到执行完最后2条语句为止。
为什么最终需要的特定情况是,如果您的try
块可能会出现异常,并且您想确保finally块中的代码始终执行,无论是否异常。
我认为,只要有可能引发异常,就不需要在默认情况下添加此内容。问题是,如果发生异常,您要怎么办?我认为处理此问题的默认方法是让异常抛出并回滚堆栈,并且仅被第一件事所捕获。
在特定情况下,当我在连接中进行与数据库相关的工作时,我总是想要一个finally块,无论是否引发异常,我都需要释放连接:< / p>
try {
const conn = pool.getConnection();
await conn.query('...');
await conn.query('...');
} finally {
// Always release, error or not
conn.release();
}
上面的代码块在我的源代码中相当普遍,但这只是因为我想不管是否发生异常都需要特定的内容。
答案 1 :(得分:0)
您可以将try / catch放入for循环中,并在catch块中,只需记录错误即可。然后它将继续运行,您可以将return语句放在for循环之后。
for (var [i, object] of tablesArchive.data.entries()) {
try {
if (Object.keys(object).length === 0) {
continue;
}
// Busca IDs de relacoes existentes
await this.getIdByRalations(tablesArchive, object, async (newObject) => {
where = { [whereByProperty]: newObject[whereByProperty] };
// Atualiza ou cria o registro na base de dados
const registro = await this.upsertWithWhere(app, tablesArchive.modelName, where, newObject);
tablesArchive.data[i].id = registro.id;
});
} catch (e) {
console.log(e);
}
}
return tablesArchive.data;
答案 2 :(得分:0)
这里介绍Promise.all() API。
简短摘要:您向Promises提供了一个Promise.all()数组,请等待直到该数组中的所有Promise都完成为止。
以您的示例为例,我会这样做:
var promises = []
for await (var [i, object] of tablesArchive.data.entries()) {
if (Object.keys(object).length === 0) {
continue;
}
// I changed this line here
// just push every async function to the promises array
promises.push(this.getIdByRalations(tablesArchive, object, async (newObject) => {
where = { [whereByProperty]: newObject[whereByProperty] };
// Atualiza ou cria o registro na base de dados
const registro = await this.upsertWithWhere(app, tablesArchive.modelName, where, newObject);
tablesArchive.data[i].id = registro.id;
}));
}
return await Promise.all(promises).then(() => {
console.log('All promises are finished')
return tablesArchive.data
}).catch(err => {
console.error('Error occured in Promises.all: ' + err)
}).finally(() => {
console.log('All promises Finished')
})