Skip to main content

Async Functions inside a Loop


Forum|alt.badge.img+18

@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:

I’m sure there’s something here that I’m not understanding about how async functions work :man_shrugging:t2:

2 replies

  • Known Participant
  • 19 replies
  • March 3, 2020

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.


Forum|alt.badge.img+18
Shrey_Banga wrote:

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.


Interesting!

Well, that was simple. Thank you, @Shrey_Banga.


Reply