当函数调用async时,服务未定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当函数调用async时,服务未定义相关的知识,希望对你有一定的参考价值。

在一个组件中,我有一个调用服务的简单方法:

  sendRequest() {
    this.myService
      .doStuff()
      .then((res) => { ... }
  }

这个doStuff()方法是http.post转换toPromise()

  doStuff(): Promise<any> {
    return this.http.post(somewhere).toPromise();
  }

在这个组件中我有另一个子组件接收函数@Input()(它是一个简单的按钮)

<my-child [callback]="sendRequest"></my-child>

当我点击这个按钮时,我得到一个

找不到属性doStuff的undefined

如果我调用以下代替doStuff,我会得到预期的行为:

  async testMe() {
    console.log("wait 5 sec");
    await new Promise(res => setTimeout(res, 5000));
    console.log("finished");
  }

我基本上试图实现这个:

https://stackblitz.com/edit/angular-ypqkcf-eduhze?file=app%2Fprogress-spinner-overview-example.ts

使用http.post而不是超时承诺。

答案

您将该函数作为输入传递。然后它失去了背景。 this中的sendRequest不再指父母成分。可能的解决方法是将lambda传递给Input,如下所示:

const lambda = () => this.sendRequest()

并在html中:

<my-child [callback]="lambda"></my-child>

顺便把回调作为Input传递给子组件并不是一个好主意。假设您传递的函数由子组件在某个事件上调用,只需使用子组件中的Output发出该事件,并使用Angular模板语法订阅它:

<my-child (onEvent)="sendRequest()"></my-child>

以上是关于当函数调用async时,服务未定义的主要内容,如果未能解决你的问题,请参考以下文章

解决调用未定义 swoole_async_readfile函数问题

Laravel Horizo​​n 抛出错误:调用未定义的函数 Laravel\Horizo​​n\Console\pcntl_async_signals()

在 Visual Studio 中,与 std::async 一起使用时未调用“thread_local”变量的析构函数,这是一个错误吗?

片段未附加到我的活动

在函数中调用时未定义 BeautifulSoup

异步函数总是返回未定义