なぜこれがうまくいかないのか理解できないようです。子ロードプロセスでAWAITを実行する親関数があります... LOADプロセスは、次にLOADDATAと呼ばれる別のAWAITを呼び出します...したがって、基本的には次のようになります。
module.exports = async function () {
try {
await load();
} catch (ex) {
console.log(ex);
logger.error(ex);
}
};
async function load() {
return await new Promise((resolve, reject) => {
TableImport.findAll().then((tables) => {
for (let table of tables) {
await loadData(table.fileName, table.tableName);
}
resolve();
}).catch(function (err) {
reject(err);
})
})
};
async function loadData(location, tableName) {
return await new Promise(function (resolve, reject) {
var currentFile = path.resolve(__dirname + '/../fdb/' + location);
sequelize.query("LOAD DATA LOCAL INFILE '" + currentFile.replace('/', '//').replace(/\\/g, '\\\\') + "' INTO TABLE " + tableName + " FIELDS TERMINATED BY '|'").then(function () {
resolve(tableName);
}).catch(function (ex) {
reject();
});
});
};
lOADのAWAITは次のように失敗します。
aload loadData(table.fileName、table.tableName); SyntaxError:予期しない識別子
明らかに非同期のスコープについて何かを理解していない!
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
はpromiseを返すため、_.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);
_
return await
_は、すでにpromiseを返しているので不要です。 return
だけで動作します。reject(err)
でエラーを伝播していました。この関数は内部でエラーを処理しないため、同じ方法でエラーを伝播します。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
_を完全に削除しました。