Tengo un formulario de interfaz de usuario para actualizar o agregar texto de traducción.
Necesitaría escribir la declaración rxjs para cumplir con lo siguiente:
Inicie httpGet en la base de datos para obtener traducciones de varios idiomas
Recorre la lista de traducciones.
Si los campos de mi interfaz de usuario coinciden con las traducciones de httpGet, necesitaría hacer una serie de httpPut para actualizarlos en la base de datos. Ejemplo: Completé la traducción al español en la interfaz de usuario, si mi httpGet arroja resultados que incluyen español, necesitaría HttpPut para actualizar el registro en español en la base de datos.
Si mis campos de IU no existen en las traducciones de httpGet, necesitaría hacer una serie de httpPost para actualizarlos en la base de datos. Ejemplo: Completé la traducción al chino en la interfaz de usuario, si mi httpGet no devuelve ningún resultado en chino, necesitaría httpPost para agregar un registro chino en la base de datos.
Escribí la primera parte, pero entiendo que rxjs no es secuencial y no puede escribir una suscripción en otra suscripción, no puedo escribirlo de esta manera.
p/s: Mi httpGet me devuelve x, en el que tiene la estructura de x.dataCount y x.dataSet. x.dataCount es el número de objetos de traducción. x.dataSet es una matriz de objetos de traducción.
¿Cómo escribo la declaración rxjs para esto? ¿Cualquier pista?
this.GetTranslations(group).subscribe(x => { x.dataSet.forEach(translation => { switch (translation.Language) { case chineseCode: if (chineseInUI){ chineseExist = true; let newChinese = { "Id": translation.Id, "Language": translation.Language, "PhraseKey": translation.PhraseKey, "PhraseValue": chineseInUI, } this.webApiService.httpPut$(this.resourceApiService.getURL('translationmanagerURL') + translation.Id, newChinese).subscribe(); } break; case spanishCode: if (spanishInUI){ let newSpanish = { "Id": translation.Id, "Language": translation.Language, "PhraseKey": translation.PhraseKey, "PhraseValue": spanishInUI } this.webApiService.httpPut$(this.resourceApiService.getURL('translationmanagerURL') + translation.Id, newSpanish).subscribe(); } break; } }); });Puedes hacerlo así usando operadores
mergeMap para crear una matriz de observablesmergeAll para obtener los valores de los observables internos en la suscripción this.GetTranslations(group) .pipe( mergeMap((x) => { return x.dataSet.map((translation) => { switch (translation.Language) { case chineseCode: if (chineseInUI) { chineseExist = true; let newChinese = { Id: translation.Id, Language: translation.Language, PhraseKey: translation.PhraseKey, PhraseValue: chineseInUI, }; return this.webApiService.httpPut$( this.resourceApiService.getURL('translationmanagerURL') + translation.Id, newChinese ); } break; case spanishCode: if (spanishInUI) { let newSpanish = { Id: translation.Id, Language: translation.Language, PhraseKey: translation.PhraseKey, PhraseValue: spanishInUI, }; return this.webApiService.httpPut$( this.resourceApiService.getURL('translationmanagerURL') + translation.Id, newSpanish ); } break; } return EMPTY; }); }), mergeAll() ) .subscribe((response) => { console.log('response', response); });