Mar 03, 2020 01:53 PM
@Kasra @Stephen_Suen @Shrey_Banga and any other JavaScript :mage: ♂
Is it possible at all to call an async function from inside a loop?
I’m trying to run a script that contains this loop:
tablesToClear.forEach(table => {
let recordsToDelete = table.records.map(record => record.id);
let recordsDeleted = await batchAnd('Delete', table, recordsToDelete);
if (recordsDeleted !== null) {
totalRecordsDeleted += recordsDeleted;
}
});
where batchAnd()
is defined as an async function
that makes a call to table.deleteRecordsAsync()
.
I’m getting this error:
ERROR
SyntaxError: await is only valid in async function
at new Function (<anonymous>)
at _callee2$ (blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:3359:53)
at tryCatch (blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:181:21)
at Generator.invoke [as _invoke] (blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:400:26)
at Generator.prototype.<computed> [as next] (blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:234:25)
at asyncGeneratorStep (blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:6:26)
at _next (blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:28:11)
at blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:35:9
at new Promise (<anonymous>)
at blob:https://block---falsh-z06h-lq-e-pb--68v3t0m.airtableblocks.com/e9e14464-0db0-424f-ad41-111819081f76:24:14
Here’s a copy of the base I’m testing it in for greater context:
Explore the "Test" base on Airtable.
I’m sure there’s something here that I’m not understanding about how async functions
work :man_shrugging:t2:
Mar 03, 2020 02:06 PM
Yeah, you can use a for loop here instead: for (let table of tablesToClear) { ... }
.
You can also make the callback async, like tablesToClear.forEach(async table => { ... })
but if you do that, the callback will be called for each table instantly without waiting for the previous batchAnd to finish, which will likely do the wrong thing.
Mar 03, 2020 02:11 PM
Interesting!
Well, that was simple. Thank you, @Shrey_Banga.