Несколько вызывающих абонентов могут подписаться на выполняемую функцию, если она возвращает обещание CommonJS:
let curWaitTask;
let lastWaitTime = new Date(1970, 0, 1);
let func1 = function() {
if(curWaitTask) {
return curWaitTask;
}
if((new Date() - lastWaitTime) > TWENTY_MINUTES) {
lastWaitTime = new Date();
curWaitTask = func2().then(func3).then(func4);
return curWaitTask;
}
}
Выше приведен подход с истекающим сроком действия кеша. Первый вызов func1
после истечения 20-минутного кэша заставит службу выполнить еще одну асинхронную операцию для обновления кэша. В то же время могут возникнуть другие вызовы func1
, которые будут ожидать одной и той же операции обновления кеша, а не повторяться снова и снова, пока кеш не будет установлен (несколько раз подряд из-за всех вызовов).
Есть ли способ получить такое поведение, используя ясность, предлагаемую ключевым словом Babel await
, вместо строки громоздких .then()
? На практике становится некрасиво.
result = await operation()
? - person Casey   schedule 20.10.2016operation()
занимает много времени, например, 1 минуту. Если строкаawait operation()
вызывается 10 раз за 5-секундный период, она будет выполнять весь 1-минутный вызов 10 раз. Но в приведенном мной примереfunc1
длинная цепочкаfunc2.then(func3).then(func4)
происходит только в первый раз, а следующие 9 вызововfunc1()
будут ждать результата первого промиса. Увидеть разницу? - person Brandon Arnold   schedule 20.10.2016curwaittask = await func1()
, а затем зациклить? - person Casey   schedule 20.10.2016lastWaitTime
когда-либо обновлялся? И что должен делать вызовfunc1
, когда нет ни кэшированного значения, ни истечения времени ожидания? - person Bergi   schedule 20.10.2016func2()
, а неfunc2
? - person Bergi   schedule 20.10.2016func2()
. Предполагалось, что наборlastWaitTime
произойдет в пределахfunc4
, но я установил его выше для ясности. - person Brandon Arnold   schedule 20.10.2016lastWaitTime
вfunc4
vs перед цепочкойthen
приводит к некоторой разнице во времени, но не меняет ответ. Тем не менее, вы так и не ответили на вопрос, что должно произойти, когдаcurWaitTask
нет, а срокlastWaitTime
еще не истек? - person Bergi   schedule 20.10.2016curWaitTask
никогда не устанавливается или значение остается там навсегда? - person Bergi   schedule 20.10.2016curWaitTask
равно нулю, за исключением первой итерации. Возможно, цепочка.then
может генерировать или возвращать null, но я не думаю, что это делает проблему более понятной для учета этих ошибок. Просто иллюстрирую метод. - person Brandon Arnold   schedule 20.10.2016