【问题标题】:Merge Map operator in Angular usageAngular 使用中的 Merge Map 运算符
【发布时间】:2019-07-04 11:50:41
【问题描述】:

我无法返回内部 observable

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”。

【问题讨论】:

    标签: angular rxjs angular6


    【解决方案1】:

    你的回调需要返回一个 observable,目前它什么也没返回。您可以使用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()
    

    【讨论】:

    • 感谢迈克尔的建议。我有一个疑问,我们没有订阅第二个发布请求方法 addAttachmentstoItem。我们使用 return 而不是订阅。为什么会这样?
    • 您不需要订阅内部可观察对象,您需要返回它,因为这就是合并映射所期望的。您实际上是在创建两个 observable 中的一个,这就是为什么您最后只需要订阅一次。
    • 代码更改后,我在 return forkJoin(obs); 时收到此错误; 'void' 类型的参数不可分配给 'ObservableInput 类型的参数
    • 你从rxjs导入forkJoin了吗?
    • 没有看到你所做的更新,基于我猜你没有将 forEach 更改为地图的例外情况
    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 2019-01-25
    • 2019-09-11
    • 2019-03-29
    • 1970-01-01
    • 2022-08-21
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多