在Angular用法中合并Map运算符

时间:2019-07-04 11:50:41

标签: angular rxjs angular6

我无法返回内部可观察的

createItem->将创建项目(POST请求) 该项目包含ID的存储库表单,通过使用该ID,我向该项目添加了附件。

addAttachmentstoItem-> POST请求

选定文件->包含以下形式的附件:我们正在循环浏览每个文件并调用addAttachmentstoItem发布请求。

内部可观察项的合并地图运算符无法返回可观察项

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'的参数分配给类型'((值:响应,索引:数字)=> ObservableInput'的参数。   不能将类型“ void”分配给类型“ ObservableInput”。

1 个答案:

答案 0 :(得分:1)

您的回调需要返回一个可观察的对象,当前它什么也不返回。您可以使用forkJoinhttps://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()