你只能使用await
异步函数内部。如果异步函数内嵌套有非异步函数,则不能使用await
在该函数中:
async function load() {
return await new Promise((resolve, reject) => {
TableImport.findAll().then((tables) => {
for (let table of tables) {
await loadData(table.fileName, table.tableName);
您有一个回调.then
方法同上。此回调不是异步的。你可以通过这样做来解决这个问题async tables => {
.
然而自从load
是异步的并且findAll
返回一个承诺,你不需要使用.then
:
async function load() {
const tables = await TableImport.findAll();
for (let table of tables) {
await loadData(table.fileName, table.tableName);
}
}
我不太确定是什么loadData
确实如此,如果您必须按顺序加载表,但您也可以并行化:
const tables = await TableImport.findAll();
const loadPromises = tables.map(table => loadData(table.fileName, table.tableName));
await Promise.all(loadPromises);
- The
return await
是多余的,因为你已经返回了一个承诺。只是return
将工作。
- 如果您按照我的建议重写,则不需要使用 Promise 对象,因为您正在使用的方法无论如何都会返回 Promise。
- 您原来的函数没有解决任何问题,因此该函数通过不返回任何内容来实现相同的效果。
- 你原来的函数也传播了一个错误
reject(err)
。该函数不会在内部处理错误,因此它也会以相同的方式传播错误。
Your loadData
函数也可以被重写和简化很多:
function loadData(location, tableName) {
const currentFile = path.resolve(__dirname + '/../fdb/' + location);
return sequelize.query("LOAD DATA LOCAL INFILE '" + currentFile.replace('/', '//').replace(/\\/g, '\\\\') + "' INTO TABLE " + tableName + " FIELDS TERMINATED BY '|'");
};
-
loadData
不需要异步,因为你不使用await
。你仍然在回报一个承诺。
- 您可能想要添加
.catch
因为在您的原始代码中您没有返回错误。我上面的代码将返回由以下原因引起的错误.query
.
- 您传递了表名,但实际上没有对返回值执行任何操作,因此我只是删除了
.then
完全。