Вызов отправки в последовательности в ngrx StateManagement

У меня есть следующий код, который использует ngrx для управления состоянием. Я относительно новичок в ngrx, и хотя я понимаю, что this.store.select используется для подписки на любое изменение состояния, у меня есть следующий вопрос.

а) Если мы вызываем функции отправки одну за другой, как в приведенном ниже фрагменте внутри функции выбора, не приведет ли это к бесконечному циклу (учитывая, что Action1, Action2 относятся к изменению одного и того же состояния и this.store.select(locationState => locationState.countriesState) продолжает выполняться с момента изменения состояния)? будет ли когда-либо вызвано третье утверждение? Является ли отправка синхронной функцией?

   this.store.dispatch('Action1');
   this.store.dispatch('Action2');
   this.router.navigation(['/confirm-region'],{relativeTo: this.route.parent })

регионкомпонент.ts

    import { Subscription } from 'rxjs/Subscription';
    
    export class RegionComponent implements OnInit,OnDestroy {
    storeSubscriptions =  <Subscription[]>[];
    constructor(private store : Store<TestState>)
    {
    }
    
    ngOnInit() {
     this.storeSubscriptions.push(
this.store.select(locationState => locationState.countriesState).subscribe(state =>
    {
     this.region = state.region,
     
     if (state.Status == true)
     {
       this.store.dispatch('Action1');
       this.store.dispatch('Action2');
       this.router.navigation(['/confirm-region'],{relativeTo: this.route.parent })
    })
    }
}

Редукторлист.ts

import {ActionReducerMap} from '@ngrx/store';
    
export interface TestState
{
 countriesState : countriesState
}
export const reducers : ActionReducerMap<TestState> = 
{ 
  countriesState : countriesStateReducer
}

страныStateReducer.ts

export function countriesReducer(state : countries,action: Action)
{

switch action.type {
 case Action1:..
 case Action2:..
}
}

🤔 А знаете ли вы, что...
JavaScript поддерживает работу с различными форматами данных, такими как JSON и XML.


1
64
1

Ответ:

Решено

Если мы вызываем функции отправки одну за другой, как в приведенном ниже фрагменте внутри функции выбора, не приведет ли это к бесконечному циклу (учитывая, что Action1, Action2 относятся к изменению одного и того же состояния, а this.store.select(locationState => locationState.countriesState) продолжает получать выполняется после изменения состояния)?

Это зависит. Вы можете разорвать петлю, отписавшись от нее. И я думаю, что отписка происходит в хуке onDestroy. (Пожалуйста, дайте мне знать, если это неправильно, но ваш пример выглядит так). Если вы никогда не отмените подписку, вы войдете в бесконечный цикл.

будет ли когда-либо вызвано третье утверждение? Является ли отправка синхронной функцией?

Да, назовут. И я думаю, что это причина, по которой ваш код все еще работает, не зависая в бесконечном цикле. Когда вы вызываете router.navigate, текущий компонент get уничтожается (я думаю, но это выглядит так, пожалуйста, проверьте самостоятельно), потому что загружен другой маршрут. Это означает, что текущий компонент отписывается от изменений состояния и прекращает отправку действий и навигацию.


Интересные вопросы для изучения

JavaScript SubtleCrypto — есть ли способ преобразовать ключи ECDSA в немного более «портативный» формат и желательно более короткий?Как запустить несколько проектов React одновременно на разных портах?Регулярное выражение javascript обрабатывает шведские символы как специальные символы и неправильно соответствуетTypeError: res.getHeader не является функцией в NextJS APIКак получить высоту и ширину фонового изображения элемента с помощью JavaScript?Добавляете дополнительные автономные компоненты Angular в компонент приложения Stackblitz по умолчанию?Как я могу получить доступ к свойствам объекта типа EChartsOption в машинописном тексте (angular + echarts)?Что приводит к невозможности изменить заголовок страницы для каждого маршрута в этом приложении Angular?NgFor не будет отображать доступные данные. Когда я пытаюсь, это ломает мой код. Как я могу это исправить?NG8001: 'firebase-ui' не является известным элементом: