Если я правильно понимаю, вы хотите убедиться, что async1
в вашем примере не будет вызываться дважды.
Простой и (довольно низкий) уровень достижения этого - памятка .
Скажем, с помощью lodash _.memoize()
это будет
const async1 = _.memoize(async1, () => 1)
// wrapping func1 and func2 is not actually required in this case
const func1 = _.memoize(() => async1());
const func2 = _.memoize(() => async2().then(async1));
return Promise.all([func1(), func2()]);
Осторожно, поскольку вы не можете прозрачно переключаться с запомненных на _un_memoized реализаций на лету.
[UPD], поскольку запоминание опирается на переданные аргументы, вам может потребоваться передать обратный вызов resolver
.Скажем, в вашем случае async1
может либо получить ноль аргументов, либо что-то из предыдущего обещания (при использовании в .then
).Таким образом, аргументы различны, но, поскольку мы знаем, что все аргументы не имеют значения, мы можем передать resolver, который возвращает константу в качестве ключа (скажем, '1')