Promise.all for running simultaneous asynchronous operations and signalling when all of them have finished.
Another thing that helped with development was that I added a little map loader which allowed me to define test cases (e.g. of just one row with one possible match). This helped immensely with checking that the matching logic and animation behaviour worked as intended. Ideally I would be able to write some sort of tests, but for the moment these little test maps work pretty well.