当前位置: 首页 > 知识库问答 >
问题:

如何在另一个组件中异步调用此服务函数?角11

汪翰墨
2023-03-14

我有一个异步函数getIdentByInfo,在控制台中,如果我将它记录在这个函数中,就会得到正确的输出。当我在另一个组件中调用它时,它就不工作了,我只得到“未定义”。我知道这与蜂群同步和承诺有关,但我不知道如何解决我的问题。我需要在另一个组件中填充来自http请求的属性的模型类,以便将它们发送到另一个服务

import { EventEmitter, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { IdentModel } from "../models/identmodel.model";
import { IdentteilComponent } from "../pages/identteil/identteil.component";

@Injectable({
  providedIn: 'root',
})
export class InfoWebservice {
  url = 'http://localhost:4201';
  ident: IdentModel[];


  constructor(private http: HttpClient) { }

  // promise vom typ IdentModel zurückgeben
  getIdentByInfo(id: string, vwk: string) {
    this.http.get(this.url).toPromise().then(data => {
      for (let i in data){
        this.ident.push(data[i])
        if ( this.ident[i].identNr == id && this.ident[i].vwk == vwk){
          return this.ident[i];
        }
      }
    });
}
}

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { InfoWebservice } from '../../webservices/info.webservice'
import { ImageWebservice } from '../../webservices/image.webservice'
import { IdentModel } from "../../models/identmodel.model";

@Component({
  selector: 'app-identteil',
  templateUrl: './identteil.component.html',
  styleUrls: ['./identteil.component.scss']
})
export class IdentteilComponent implements OnInit {

  ident = [];
  identNr:string;
  vwk:string;
  imgFrontLink:string;
  imgBackLink:string;

  constructor(private router: Router, private service: InfoWebservice, private image: ImageWebservice) {  }

  getIdentNr() : string  {
    var split = this.router.url.split("/");
    this.identNr = split[2];
    return this.identNr;
  }

  //return type is STRING
  getVwk()  {
    // output von window.location.host = repapp-maw.dbl.de
    // var splitHost = window.location.host.split(".");
    var splitHost = 'repapp-maw';
    var splitV = splitHost.split("-");
    this.vwk = splitV[1];
    return this.vwk;
  }

   callInfoService = async () => {
    return await this.service.getIdentByInfo(this.getIdentNr(), this.getVwk());
  }

  ngOnInit() {
    console.log(this.callInfoService());
  }
}

共有1个答案

吉泰宁
2023-03-14

当你使用angular时,最好不要使用Await/Promise。Angular有一个内置的RX-JS库,它有很多超级棒的功能,你可以使用。

例如,在您的情况下,您可以这样做:

// Your Service File can make use of 'Behavior Subject' 
// Please read more about it here: https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject

import { EventEmitter, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { IdentModel } from "../models/identmodel.model";
import { IdentteilComponent } from "../pages/identteil/identteil.component";

@Injectable({
  providedIn: 'root',
})
export class InfoWebservice {
  url = 'http://localhost:4201';
  ident: IdentModel[];

  initialIdentValues: IdentModel = [];

  private identSource: BehaviorSubject<IdentModel[]> = new BehaviorSubject<IdentModel[]>(this.initialIdentValues);

  public identValuesObs$: Observable<IdentModel[]> = this.identSource.asObservable();
 
 // Create a method to set the values in component-1
 setIdentValues(identValues: IdentModel[]) {
   this.identSource.next(identValues);
 }
 
 // Create a method to return values in component-2 or any component
 returnIdentValues() {
  return this.identValuesObs$;
 }
  

  constructor(private http: HttpClient) { }

  // Change your service call to this:
  getIdentByInfo(id: string, vwk: string): Observable<any> {
    return this.http.get(this.url);
  }
}

现在,在您的组件-1中,您要设置此identValues的值:

// Component-1

constructor(private infoWebService: InfoWebService){}


// Create a method where you get the values

someMethod() {
  // Call the API method here and subscribe and then set the values
  this.infoWebService.getIdentInfoById(id, vwk).subscribe((data: any) => {
     // Your logic goes here ANDD
    if (data) {
      for (let i in data){
        this.ident.push(data[i])
        let localIdentsWithRequiredLogic = [];
        if ( this.ident[i].identNr == id && this.ident[i].vwk == vwk){
          localIdentsWithRequiredLogic.push(this.ident[i]);
        }

          // THIS IS IMPORTANT
          this.infoWebService.setIdentValues(localIdentsWithRequiredLogic);
      }
    }
  })
}

然后在component-2或任何您想要的组件中,您可以使用returnIdentValues方法检索它,如下所示:

// In component-2

inSomeMethodWhereYouRequireIdentValues() {
  this.infoWebService.returnIdentValues().subscribe(data => {
     console.log(data) // this is data that you set in component one  
  })
}

 类似资料:
  • 我有两个组件,如下所示,我想从另一个组件调用一个函数。这两个组件都包含在第三个父组件 using 指令中。 构成部分1: 我尝试过使用和但我不知道如何使用它以及如何调用该函数,任何人都可以帮忙吗?

  • 问题内容: 抱歉,我确定一个基本问题,但似乎无法弄清楚。 说我有这个程序,文件名为: 如何在另一个程序中调用它?我试过了: 而不是“ hello world”,我得到了……过去我通过将第一个文件设为类来做到这一点,但我想知道如何正确导入该函数?如果有帮助,我会在我的真实文件中打印字典 问题答案: 您需要打印调用函数的结果,而不是函数本身: 另外,您可以省略子句,而不是: 如果更方便,也可以使用:

  • 问题内容: 基于此答案,我想在一个将从另一个文件导入的类中构建一个异步websoket客户端: 然后将其导入中,其中包含以下内容: 但是它检索到以下错误: 这是怎么回事?如果mtest.get_ticks开头是单词,为什么我不能访问它? 问题答案: 最后,我可以找到正确的方法(特别感谢 @dirn ) 这在main.py中: 这是输出: 任何改进的技巧都值得欢迎!;)

  • 各位专家下午好, 我需要调用3个REST API的顺序调用,作为单个客户机调用GET/offers的一部分,以检索百货公司不同通道中每种产品的可用报价,如下所示 然后在循环中检索每个并调用第二个API以获得产品 然后在循环中检索每个并调用第三个API以获得提供 最后,整理所有的响应,将报价列表发送给客户。

  • 我的JavaScript代码如下所示: 完成所有这些异步调用后,我想计算所有数组的最小值。 我怎么能等到他们所有人呢? 我现在唯一的想法是有一个布尔数组叫做done,并在第i个回调函数中将done[i]设置为true,然后说while(not all are done){} edit:我想一个可能的,但很难看的解决方案是在每个回调中编辑done数组,然后在每个回调中设置了所有其他done的情况下调

  • 问题内容: 是否可以从另一个(在同一类中,而不是在子类中)调用构造函数?如果是,怎么办?调用另一个构造函数的最佳方法是什么(如果有几种方法可以做到)? 问题答案: 对的,这是可能的: 要链接到特定的超类构造函数而不是同一类中的构造函数,请使用代替。注意,你只能链接到一个构造函数,它必须是构造函数主体中的第一条语句。