如何在从http请求获取对象之后从对象中转换多个字符串,然后使用转换后的字符串存储该对象

如何在从http请求获取对象之后从对象中转换多个字符串,然后使用转换后的字符串存储该对象

问题描述:

我正在从http请求获取对象。我使用put方法通过另一个http请求存储该对象。我想在存储该对象之前使用Google翻译API将该对象中的一些字符串翻译为不同的语言。我怎样才能做到这一点。如何在从http请求获取对象之后从对象中转换多个字符串,然后使用转换后的字符串存储该对象

service.ts

import { Injectable } from '@angular/core'; 
import { HttpClient, HttpErrorResponse } from '@angular/common/http'; 
import { Observable } from 'rxjs/Rx'; 

import { BaseApi } from '../../../../laas/base-api.service'; 
import { ApplicantService } from '../../../../laas/applicant.service'; 
import { environment as ENV } from '../../../../../environments/environment' 

@Injectable() 
export class NregaService { 

    private applicantId: string; 
    private baseUrl: string; 

    constructor(
    private http: HttpClient, 
    private api: BaseApi, 
    private applicant: ApplicantService 
) { 
    this.applicantId = applicant.getApplicantID() 
    this.baseUrl = `/applicants/${this.applicantId}/id/nrega`; 

    } 

    get() { 
    return this.api.newGet(this.baseUrl); 
    } 

    save(type, data) { 
    return this.api.put(this.baseUrl, { type: type, data: data }); 
    } 

    translate(q) { 
    const translateUrl = ENV.googleAddress.translateUrl; 
    const apiKey = ENV.googleAddress.apiKey; 
    const target = 'en'; 
    const model = 'base'; 
    return this.http.post(`${translateUrl}${apiKey}`, { q, target, model }).map(res => { 
     const value = res['data'].translations[0]; 
     console.log(`Translated ${q}:`, value); 
     return value.translatedText; 
    }); 
    } 

    verify(id) { 
    return this.api.post('nrega', { jobcardid: id }).map(result => { 
     if (typeof result === typeof '') { 
     throw result; 
     } 

     const incomes = []; 
     if (result.incomeDetail) { 
     result.incomeDetail 
      .sort((a, b) => a.year <= b.year ? -1 : 1) 
      .forEach(income => incomes.push({ income: income['income(Rs.)'], year: income.year })); 
     } 

     const details = []; 
     if (result.applicantDetail) { 
     result.applicantDetail.forEach(detail => details.push({ 
      name: detail.name, 
      gender: detail.gender[0].toLowerCase(), 
      age: detail.age, 
      bankOrPostOffice: detail.bankorpostoffice, 
      aadhaarNo: detail.aadhaarNo, 
      accountNo: detail.accountNo 
     })); 
     } 

     const data = { 
     jobCardId: result.jobcardno, 
     regDate: result.dateOfRegistration, 
     photo: result.photoImageUrl, 
     voterId: result.voterId, 
     fatherOrHusband: result.nameOfFatherOrHusband, 
     family: { 
      ids: [result.familyId1, result.familyId], 
      members: details, 
      head: result.nameOfHead, 
      isBpl: result.bplFamily.toLowerCase() === 'yes' ? true : false, 
      bplId: result.bplFamilyId, 
     }, 
     address: { 
      full: result.address, 
      village: result.village, 
      district: result.district, 
      panchayat: result.panchayat, 
      block: result.block 
     }, 
     category: result.category, 
     incomes: incomes, 
     }; 
     console.log('NREGA: ', data); 

     return data; 
    }); 
    } 

} 

如果我使用也许是因为我没有使用.subscribe方法(我使用的部件,其中翻译方法翻译服务字符串本身然后我得到错误我在调用服务的verify()方法。在将数据返回到组件之前,是否可以将多个字符串转换为服务本身?

我认为您要查找的是Rxjs 地图运营商。

首先,在你的service.ts文件中导入这个操作符。

import 'rxjs/add/operator/map'; 

然后,如果我得到了你的观点,你要当你的组件调用get方法,该数据已经从服务器,但收到后翻译一些字符串之前,该方法已发送的数据回组件。

组件> service.get()> HTTP服务器从接收到的请求>数据>翻译送到部件

如果我是正确的,唯一的事情,你必须>数据做的是使用地图操作:

get() { 
    return this.api.newGet(this.baseUrl) 
    .map(data => this.translate(data)); 
} 

让我们想象一下一个SourceData类型和ModifiedData类型。地图运算符将让您返回Observable<ModifiedData>而不是您用于发回的Observable<SourceData>。查看文档here以获得更好的解释。

请注意,您也可以在调用保存方法时进行翻译。

save(type, data) { 
    data = this.translate(data) 
    return this.api.put(this.baseUrl, { type: type, data: data }); 
}