似乎无法弄清楚为什么这对我不起作用。我有一个父函数,它在子加载过程中执行AWAIT ... LOAD过程依次调用另一个叫做LOADDATA的AWAIT ...所以基本上是这样的:
sp <- ggplot(mpg, aes(hwy, cty)) +
geom_point() +
theme_classic() +
annotate("text", label = "top",
x = 0.5*(min(mpg$hwy) + max(mpg$hwy)), y = max(mpg$cty), vjust = 1) +
annotate("text", label = "bottom",
x = 0.5*(min(mpg$hwy) + max(mpg$hwy)), y = min(mpg$cty), vjust = 0) +
annotate("text", label = "right",
x = max(mpg$hwy), y = 0.5*(min(mpg$cty) + max(mpg$cty)), hjust = 1) +
annotate("text", label = "left",
x = min(mpg$hwy), y = 0.5*(min(mpg$cty) + max(mpg$cty)), hjust = 0)
sp
LOAD中的AWAIT未能说明:
await loadData(table.fileName,table.tableName); SyntaxError:意外的标识符
显然不了解异步的范围!
答案 0 :(得分:7)
您只能在异步功能中使用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);
return await
是多余的。只需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
。