如何使用事件发射器调用返回值的函数,并在继续之前等待响应?

Posted

技术标签:

【中文标题】如何使用事件发射器调用返回值的函数,并在继续之前等待响应?【英文标题】:How can I use an Event Emitter to call a function that returns a value, and wait for the response before proceeding? 【发布时间】:2020-04-10 09:48:54 【问题描述】:

所以我想从一个子组件发出一个触发父组件中的函数的事件,但我想在继续之前等待从该父函数获得响应。

孩子

@Output() callParentFunction = new EventEmitter<any>();

...

this.callParentFunction.emit();
let tempVal = responseFromParentComponent; //How can I set this value?
//After parent function has returned a response, the next line of code should run
console.log("Response returned");

父母

template: `
    <child-component
      (callParentFunction)="parentFunction($event)"
    >
    </child-component>
  `

...

parentFunction()
    //This function calls an api, then returns the response
    [API call goes here]
    return response;

如何设置这个事件发射器?或者有没有办法在没有事件发射器的情况下做到这一点?

【问题讨论】:

你会在parentFunction() 不做你的逻辑吗? @penleychan 子组件在收到父组件的响应后仍有需要做的逻辑 在这种情况下,您应该通过BehaviorSubjectSubject 使用服务来处理它 【参考方案1】:

parent-child 通信的情况下,我会坚持使用 setters 以便在属性更改时做一些事情。

child.component.ts

@Input()
set response (v: any) 
 // Do some logic here


@Output() 
callParentFunction = new EventEmitter<any>();

doStuff () 
 this.callParentFunction.emit();

parent.component.ts

public response$: Observable<IResponse | null> = of(null);

parentFunction()
    this.response$ = this.http.get(/* ... */)

parent.component.html

<child-component
  [response]="response$ | async" 
 (callParentFunction)="parentFunction($event)"
></child-component>

【讨论】:

以上是关于如何使用事件发射器调用返回值的函数,并在继续之前等待响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Node.js中对使用promises和事件发射器的函数进行单元测试?

用玩笑模拟自定义事件发射器

Qt带返回值的信号发射方式(使用QMetaObject::invokeMethod)

如何从事件处理程序返回任务?

Spec没有期待——Jasmine测试回调函数

如何使用在 Nextjs 上的窗口加载事件上返回本地存储值的函数初始化状态? [复制]