Я пытаюсь выполнить эту относительно сложную операцию в BaconJs.
По сути, идея состоит в том, чтобы продолжать пробовать каждый check
до тех пор, пока вы не получите статус «пройдено» или пока все они не потерпят неудачу. Подвох в том, что у статусов «ожидание» есть список Observables (созданный из запросов jquery ajax), которые разрешат проверку. Из соображений производительности вам нужно попробовать каждый Observable по порядку, пока либо все они не пройдут, либо один не выйдет из строя.
Вот полный псевдоалгоритм:
- Go thru each check. A
check
contains anid
andstatus
= fail/pass/pending. If pending, it contains a list ofobservables
.- If status = pass, then return the id (you're done!)
- если статус = сбой, то попробуйте следующую проверку
- if status = pending
- try each observable in order
- if observable result is 'false', then try the next check
- если достигнут конец наблюдаемого списка и результат «истина», верните идентификатор (все готово!)
- try each observable in order
Вот код Бэкона. Это не работает, когда Observables являются запросами Ajax. По сути, происходит то, что он пропускает ожидающие проверки .... он не ждет возврата вызовов ajax. Если я помещу log() прямо перед filter(), он не будет регистрировать ожидающие запросы:
Bacon.fromArray(checks)
.flatMap(function(check) {
return check.status === 'pass' ? check.id :
check.status === 'fail' ? null :
Bacon.fromArray(check.observables)
.flatMap(function(obs) { return obs; })
.takeWhile(function(obsResult) { return obsResult; })
.last()
.map(function(obsResult) { return obsResult ? check.id : null; });
})
.filter(function(contextId) { return contextId !== null; })
.first();
ОБНОВЛЕНИЕ: код работает, когда проверки выглядят так: [сбой, сбой, ожидание]. Но это не работает, когда проверки выглядят так: [fail, pending, pass]
flatMap
имеют одинаковую семантику. - person Bergi   schedule 26.06.2015