Вы должны быть в состоянии решить эту проблему с помощью throttle
operator - которая принимает функцию, которая возвращает наблюдаемую и, пока что наблюдаемые испускает любые значения, испускаемые источник не задушила/игнорируются.
Если вы передадите throttle
сам эффект, любые действия, полученные во время обработки медленного запроса, будут проигнорированы. Например:
import 'rxjs/add/operator/throttle';
@Effect()
someEffect = this.actions
.ofType(SOME_REQUEST)
.throttle(() => this.someEffect)
.switchMap((action) => someSlowRequest(action.payload)
.map((result) => ({ type: SOME_RESPONSE, payload: result }))
.catch((error) => Observable.of({ type: SOME_ERROR, payload: error }))
);
Если вы используете throttle
таким образом с вашим HTTP на основе эффекта, он будет видеть какие-либо действия, которые вызывают эффект игнорируется, если есть запрос в ожидании HTTP. Поэтому, если это поведение, которое вы ищете, оно должно решить вашу проблему.
Что касается Вашего комментария, если вы хотите, последние из близкорасположенных действий, подлежащая обработке, вы могли бы рассмотреть вопрос об использовании auditTime
operator - который будет ждать в течение заданного времени, а затем будет излучать последний полученное значение:
import 'rxjs/add/operator/auditTime';
@Effect()
someEffect = this.actions
.ofType(SOME_REQUEST)
.auditTime(100)
.switchMap((action) => someSlowRequest(action.payload)
.map((result) => ({ type: SOME_RESPONSE, payload: result }))
.catch((error) => Observable.of({ type: SOME_ERROR, payload: error }))
);
В качестве альтернативы вы можете просто положиться на оператора switchMap
- который отписывает при получении новых значений. Тем не менее, я понимаю, что действия ngrx
отправляются синхронно, поэтому для каждого действия может быть сделан HTTP-запрос, и я не уверен, как реализация будет управлять их отменой - может быть, их ответы просто игнорируются.
Спасибо за это предложение, однако я должен был отметить, что мне нужен последний звонок. Могу ли я отменить запрос, отказавшись от запроса? – maddockst
Большое спасибо. Я думаю, мне нужно взглянуть на операторы rxjs. – maddockst
Я обновил ответ. – cartant