Это более сложно, но я бы предложил использовать третью функцию для контроля результатов. Примерно так:
1) Запуск монитора - использование соответствующего монитора интервалов (здесь важно использовать интервал для проверки - простой цикл будет сильно блокировать двигатель JS) результатов запросов A и B.
2) Запрос вызова А.
3) Запрос вызова Б.
4) Запрос B завершается - функция обратного вызова устанавливает "B All Done!" значение.
5) Запрос A завершается - функция обратного вызова устанавливает «A All Done!» значение.
6) Монитор распознает, что оба запроса выполнены, и вызывает функцию, которая использует данные из обоих.
Проще говоря, это «зависимости» (множественные вызовы) от «контроля» (функция, проверяющая зависимости) до «завершения» (действие, которое нужно выполнить, когда все будет готово).
Вы можете создавать обратные вызовы и функцию завершения как вложенные функции, чтобы поддерживать инкапсуляцию и уменьшать "немного" в глобальной области видимости.
Вы можете расширить свои зависимости так, как вам нравится.