【问题标题】:can't pass an object into a component because of subscribe由于订阅,无法将对象传递给组件
【发布时间】:2021-08-14 07:55:55
【问题描述】:

我遇到了一个问题:我调用了一个 post 请求,该请求将一个对象保存在数据库中,并输入一个 json,该 json 基本上具有我要保存的对象的值(数据库会这样做),但是之后我希望我的 servlet 返回它保存的对象,因为如果它需要 id(id 是后端生成的唯一值) angular cli组件调用的servlet的代码是:

postprogetti(raw: any,cli:cliente,gr:any,fp:any,comp:any){
    var prog = '{'  +'"id":'+'0'+','+'"nome":'+'"'+raw[0]+'"'+','+'"cli":'+JSON.stringify(cli)+',"setCompetenze_prog":'+JSON.stringify(comp)+','+'"SetFigProf"'+':'+JSON.stringify(fp)+  ',"SetGruppo":'+JSON.stringify(gr)+'}'
    const obj = JSON.parse(prog);
    console.log("obj ->"+ JSON.stringify(obj))
    var res = this.http.post<any>('http://localhost:8080/postprogetto_competenze_figprof', obj).subscribe(
        (val) => {
            console.log("andata", val);
        })
       
}

console.log("andata", val); 这将打印我想要返回到组件的数据,如何编辑代码以使此函数返回此数据?谢谢

编辑:进口?

【问题讨论】:

  • 该方法不能只关心进行 api 调用吗?在组件中订阅它,然后对响应做任何你需要做的事情。

标签: angular typescript frontend


【解决方案1】:

在这里你可以做一件事。你可以只返回你从这个 post 请求的调用中得到的 observable。然后您可以在同一文件的其他函数文件中订阅该 observable。像下面的东西

    postprogetti(raw: any,cli:cliente,gr:any,fp:any,comp:any){
    var prog = '{'  +'"id":'+'0'+','+'"nome":'+'"'+raw[0]+'"'+','+'"cli":'+JSON.stringify(cli)+',"setCompetenze_prog":'+JSON.stringify(comp)+','+'"SetFigProf"'+':'+JSON.stringify(fp)+  ',"SetGruppo":'+JSON.stringify(gr)+'}'
    const obj = JSON.parse(prog);
    console.log("obj ->"+ JSON.stringify(obj))
     //returning onservable on below line. 
     return this.http.post<any>('http://localhost:8080/postprogetto_competenze_figprof', obj);
       
}

现在在同一个文件或其他文件中调用此函数后需要订阅它。就像下面

 postprogetti(raw,cli,gr,fp,comp).subscribe((response) => {
     if(response) {
        console.log('response', response);
     }
    }, (error) => {
        console.error(error);
    });

【讨论】:

    【解决方案2】:

    您可以使用承诺的概念来获取数据。

    postprogetti(raw: any,cli:cliente,gr:any,fp:any,comp:any){
     return new Promise(function(resolve){
          var prog = '{'  +'"id":'+'0'+','+'"nome":'+'"'+raw[0]+'"'+','+'"cli":'+JSON.stringify(cli)+',"setCompetenze_prog":'+JSON.stringify(comp)+','+'"SetFigProf"'+':'+JSON.stringify(fp)+  ',"SetGruppo":'+JSON.stringify(gr)+'}'
          const obj = JSON.parse(prog);
          console.log("obj ->"+ JSON.stringify(obj))
          var res = this.http.post<any>('http://localhost:8080/postprogetto_competenze_figprof', obj).subscribe(
              (val) => {
                  console.log("andata", val);
                  resolve(val)
              })
     });
           
    }
    
    
    // to get the data
    postprogetti.then(function(data) {
      console.log(data)
    })
    

    【讨论】:

    • 好的,我正在尝试你的代码,但我不知道我必须从 whitch 模块导入它,ide 给了我很多选择,如“dns”、“path”、“url”等,我选什么?
    • 所以函数resolve等待数据可用,然后将它们发送到组件,对吧?
    • 一种@pietro,我已经将你所有的代码包装在一个承诺中。一个承诺可以在需要时及时解决。 resolved 表示块的触发完成,类似于return关键字
    • 好的,谢谢,我应该使用哪个导入?请看问题,我正在编辑它,谢谢
    • @pietro 您无需导入任何内容即可使用resolve。它是 `promise` 提供的最重要的功能。
    猜你喜欢
    • 2017-10-25
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2019-09-10
    • 2023-03-26
    • 2017-01-31
    • 1970-01-01
    相关资源
    最近更新 更多