Использование forkJoin в качестве оператора lettable в RxJS 6 pipe - PullRequest
0 голосов
/ 29 мая 2019

Конечная цель
У меня есть метод регистрации пользователя / устройства.В нем мне нужно:

  1. Проверить, готово ли локальное хранилище
  2. Если это так, проверить отдельно для ID устройства и токена
  3. Если DeviceId или токен не найдены, конечная точка регистрации вызовов

Где я нахожусь
Во время сборки, для простоты, я не занимался токенизацией.Я работал только с deviceId и ниже работал / работает отлично.

Я вызываю свой вспомогательный метод isStorageReady, проверяю ответ, затем вызываю мой вспомогательный метод getDeviceId и проверяю этот ответ.

this.isStorageReadyAsync()
    .pipe(
        map(storageResponse => {
            // check storageResponse
            // if undefined throw error
            // error picked up by retryPipeline
            // if retryPipeline exhausted picked up 
            // by errorPipeline and stream is stopped
            if (storageRes === undefined ||
                storageRes['LOCALSTORAGE'] === undefined ||
                storageRes['LOCALSTORAGE'] === '') throw 'storageRes or 
                storageRes.LOCALSTORAGE are undefined or empty';
        }),
        flatMap(_ => this.getStoredDeviceIdAsync()),
        map(deviceId => {
            return iif(() => deviceId === undefined || 
                             deviceId === null || 
                             deviceId === '',
                       // no deviceId stored on device
                       // register device to get deviceId
                       this.registerDeviceAsync(), 
                       // deviceId found in local storage
                       of({id: deviceId, new: false}))
        }),
        this.storeDeviceIdPipeline, // store deviceId
        this.retryPipeline, // retry if e.g. experiencing network issues
        this.errorPipeline // catch and handle errors
    )

Где я застрял
У меня есть второй вспомогательный метод, getStoredTokenAsync(), который я хотел бы вызвать параллельно с getStoredDeviceIdAsync().Я попытался использовать forkJoin и передать массив в оператор map, который следует, но моему машинописному линтеру это совсем не нравится.Все перед forkJoin подчеркивается, как будто это ошибка, и ошибка читается следующим образом:

Аргумент типа OperatorFunction не может быть назначен параметру типа OperatorFunction.Тип void нельзя присвоить типу {}.

Так что я не совсем понимаю.Я надеялся использовать что-то вроде этого:

...
forkJoin([this.getStoredDeviceIdAsync(), this.getStoredTokenAsync()]),
map(authArr => {
   let deviceId = authArr[0];
   let token = authArr[1];
   ...
})
...

1 Ответ

0 голосов
/ 22 июня 2019

Спасибо обоим комментаторам, LookForAngular и Юлиусу Дзидзявичюсу, за помощь в создании этого!Предоставляю полный ответ здесь, если это полезно для других.Также предоставляет больше кода для некоторого дополнительного контекста.

Перед вызовом mergeMapTo есть некоторая общая проверка ответа.Вывод этого не расходуется, поэтому использование mergeMapTo уместно (подразумевается, что то, что было до этого, не имеет отношения к тому, что происходит внутри mergeMapTo).

mergeMap существенно выравнивает внутреннюю наблюдаемость, что обеспечивается моим вызовом iif.Вывод mergeMap направляется в мой конвейер хранения (это просто вызов map), который обрабатывает всю логику, связанную с аутентификацией пользователя и т. Д.

pipe(
    ...
    mergeMapTo(forkJoin([this.getStoredDeviceIdAsync(), this.getStoredTokenAsync()])),
    mergeMap(authArr => {
        let deviceId = authArr[0];
        let token = authArr[1];
        return iif(() => deviceId === undefined || deviceId === null || deviceId === '' ||
                         token === undefined || token === null || token === '',
                         this.registerDeviceAsync(), // register device to get deviceId and token
                         of({deviceId: deviceId, token: token, new: false})) 
    }),
    this.storeDeviceIdTokenPipeline,
    this._config.retryPipeline, // generic retryWhen procedure
    this._config.errorPipeline // generic catchError procedure
)
...