Оператор Merge Map в использовании Angular - PullRequest
0 голосов
/ 04 июля 2019

Я не могу вернуть внутреннюю наблюдаемую

createItem -> создаст элемент (запрос POST) Resposne форма, в которой элемент содержит ID, используя этот идентификатор, я добавляю Attachemnts в Item.

addAttachmentstoItem -> POST-запрос

выбранный файл -> содержит вложенные файлы в форме, мы перебираем каждый файл и вызываем пост-запрос addAttachmentstoItem.

Merge MapОператор для внутренней наблюдаемой не может вернуть наблюдаемый

this.sharepointService.createItem(this.itemData)
  .pipe(
    mergeMap  (( response : Response) => {
      this.lastItemCreatedId = response['d'].ID
      this.selectedfile.forEach( (file) => {
        let filename = file.name
        let url = "_spPageContextInfo.webAbsoluteUrl"+"_api/web/lists/getByTitle('"+ libraryName +"')/items("+this.lastItemCreatedId+")/AttachmentFiles/add(FileName = '"+filename+"')"
      return this.sharepointService.addAttachementstoItem(url,filename).subscribe( response => console.log("File Uploaded"))
 })
    }),
  ).subscribe()

код в sharepointService:

 createItem(itemData): Observable<Object> {
 console.log("Inside postItem")
 console.log(itemData.reqno)
  var body = {
    "__metadata" : {'type' : 'SP.Data.CustomListListItem'},
    'Title' : 'first',
    'Requisition_x0020_Number' : itemData.reqno,
    'Site_x0020_Security_x0020_Groups' : itemData.sitesecuritygroups,
    'User_x0020_Security_x0020_Groups' :itemData.usersecuritygroups,
    'Attachments' : itemData.selectedfile
  }
  return this.http.post(this.baseUrl+"_api/web/lists/getbytitle('CustomList')/items",body)
 }

 addAttachementstoItem(url,selectedfile): Observable<Object> {
   console.log(url)
   return this.http.post(url,selectedfile)
 }

Я получаю сообщение об ошибке: Аргумент типа '(ответ: Ответ) => void 'нельзя назначить параметру типа' (значение: Response, index: number) => ObservableInput '.Тип 'void' нельзя назначить типу 'ObservableInput'.

1 Ответ

1 голос
/ 04 июля 2019

Ваш обратный вызов должен вернуть наблюдаемое, в настоящее время он ничего не возвращает. Вы можете использовать оператор forkJoin (https://www.learnrxjs.io/operators/combination/forkjoin.html)) для создания наблюдаемой, которая будет излучать после завершения создания всех наблюдаемых, которые вы создаете, после завершения addAttachmentsToItem и возвращать их. Что-то вроде следующего:

this.sharepointService.createItem(this.itemData)
  .pipe(
    mergeMap(( response : Response) => {
      this.lastItemCreatedId = response['d'].ID
      const obs = this.selectedfile.map((file) => {
        let filename = file.name
        let url = "spPageContextInfo.webAbsoluteUrl"+"_api/web/lists/getByTitle('"+ libraryName +"')/items("+this.lastItemCreatedId+")/AttachmentFiles/add(FileName = '"+filename+"')"
        return this.sharepointService.addAttachementstoItem(url,filename)
       })
       return forkJoin(...obs);
    }),
  ).subscribe()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...