Ngrx-эффект не отправляет полезную нагрузку в действии на iOS - PullRequest
1 голос
/ 02 октября 2019

Некоторое время я пытался найти решение своей проблемы, однако до сих пор ничего не помогало. Я работаю над приложением Ionic 4 с Angular 8 и Ngrx. Я создал @Effect для вызова службы, которая вызывает службу http, а затем мне нужно выполнить два действия. Один из них также имеет полезную нагрузку. Все отлично работает в разработке (браузеры). Я пробовал на Chrome, Firefox, Safari. Проблема появляется, когда я пытаюсь на iPhone. На iPhone полезная нагрузка, отправляющая к действию - пустой объект {} вместо объекта с правильными полями.

Я пытался построить в непроизводственном режиме, отключив aot, build-optimizer, оптимизацию.

Store init:

StoreModule.forFeature('rental', reducer),
EffectsModule.forFeature([RentalServiceEffect]),

Store:

export interface Contract {
    address: string;
    identity: string;
    endRentSignature?: string;
}

export interface RentalStoreState {
    status: RentStatus;
    contract?: Contract;
    metadata?: RentalMetadata;
    summary?: RentalSummary;
    carState?: CarState;
}

export const initialState: RentalStoreState = {
    status: RentStatus.NOT_STARTED,
    contract: {
        address: null,
        identity: null,
        endRentSignature: null,
    },
};

Действие:

export const rentVerified = createAction(
    '[RENTAL] RENT_VERIFIED',
    (payload: Contract) => ({ payload })
);

Редуктор:

const rentalReducer = createReducer(
    initialState,
    on(RentActions.rentVerified, (state, { payload }) => ({
        ...state,
        contract: payload,
        status: RentStatus.RENT_VERIFIED
    })));

export function reducer(state: RentalStoreState | undefined, action: Action) {
    return rentalReducer(state, action);
}

Метод изуслуга:

   public startRentalProcedure(
        vehicle: Vehicle,
        loading: any
    ): Observable<IRentalStartResponse> {
        loading.present();

        return new Observable(observe => {
            const id = '';
            const key = this.walletService.getActiveAccountId();

            this.fleetNodeSrv
                .startRent(id, key, vehicle.id)
                .subscribe(
                    res => {
                        loading.dismiss();
                        observe.next(res);
                        observe.complete();
                    },
                    err => {
                        loading.dismiss();
                        observe.error(err);
                        observe.complete();
                    }
                );
        });
    }

Проблемный эффект:

@Effect()
public startRentalProcedure$ = this.actions$.pipe(
    ofType(RentalActions.startRentVerifying),
    switchMap(action => {
        return this.rentalSrv
            .startRentalProcedure(action.vehicle, action.loading)
            .pipe(
                mergeMap(response => {
                    return [
                            RentalActions.rentVerified({
                                address: response.address,
                                identity: response.identity
                            }),
                            MainActions.rentalProcedureStarted()
                        ];
                    }),
                    catchError(err => {
                        this.showConfirmationError(err);
                        return of({ type: '[RENTAL] START_RENTAL_FAILED' });
                    })
                );
        })
    );
...