Javascript 使用Promise的Angular9情态动词

Javascript 使用Promise的Angular9情态动词,javascript,angular,promise,Javascript,Angular,Promise,我试图在Angular 9中创建一个模态,作为结果返回一个承诺。我不知道如何将承诺逻辑移到声明之外 <a class="button-primary" (click)="yes()">Yes</a> <a class="button-default" (click)="no()">No</a> 是 不 这是模态控制器 import { Component, OnInit, HostBinding } from '@angular/core';

我试图在Angular 9中创建一个模态,作为结果返回一个承诺。我不知道如何将承诺逻辑移到声明之外

<a class="button-primary" (click)="yes()">Yes</a>
<a class="button-default" (click)="no()">No</a>
是
不
这是模态控制器

import { Component, OnInit, HostBinding } from '@angular/core';

@Component({
  selector: 'change-username-modal',
  templateUrl: './change-username-modal.component.html',
  styleUrls: ['./change-username-modal.component.less']
})
export class ChangeUsernameModalComponent implements OnInit {

  @HostBinding('class.show')
  show: boolean = false;

  constructor() { }

  ngOnInit(): void {
    console.log('init');
  }

  public open(): Promise<boolean> {
    return new Promise(function(resolve, reject) {
      resolve(true);
    });
  }

  yes() {
    //this.myPromise.resolve(true);
    this.show = false;
  }

  no() {
    //this.myPromise.reject(false);
    this.show = false;
  }

}
从'@angular/core'导入{Component,OnInit,HostBinding};
@组成部分({
选择器:“更改用户名模式”,
templateUrl:'。/更改用户名modal.component.html',
样式URL:['./更改用户名modal.component.less']
})
导出类ChangeUsernameModalComponent实现OnInit{
@HostBinding('class.show')
show:boolean=false;
构造函数(){}
ngOnInit():void{
console.log('init');
}
公共开放:承诺{
返回新承诺(功能(解决、拒绝){
决心(正确);
});
}
是(){
//这个。我的承诺。决心(真实);
this.show=false;
}
否(){
//此.我的承诺.拒绝(错误);
this.show=false;
}
}
我需要在调用yes()或no()函数时解析或拒绝承诺。
提前谢谢你

你可以使用可观察的方法而不是承诺。您需要一个简单的主题,它将立即发出并完成(以避免内存泄漏)。代码应该是这样的

export class Component{

  @HostBinding('class.show')
  show: boolean = false;

  private _emitter$ = new Subject<boolean>();

  constructor() { }

  ngOnInit(): void {
    console.log('init');
  }

  public open(): Observable<boolean> {
    return this._emitter.asObservable();
  }

  yes() {
    //this.myPromise.resolve(true);
    this.show = false;
    this.emitAndClose(true);
  }

  emitAndClose(answer:boolean){
     this._emitter.next(answer);
     this._emitter.complete();
  }

  no() {
    this.emitAndClose(false);
    this.show = false;

  }

}
导出类组件{
@HostBinding('class.show')
show:boolean=false;
private _emitter$=新主题();
构造函数(){}
ngOnInit():void{
console.log('init');
}
public open():可观察{
返回此项。_emitter.asObservable();
}
是(){
//这个。我的承诺。决心(真实);
this.show=false;
此.emit和close(true);
}
emitAndClose(回答:布尔){
这个。下一个(回答);
这个。_emitter.complete();
}
否(){
此.emitAndClose(false);
this.show=false;
}
}

现在,无论何时单击答案,它都会发出值并完成主题,因此您不需要在外部取消订阅

您可以实现这一点,非常简单,可以观察到,您坚持要有承诺吗?我认为承诺更优雅,因为我只需要来自Modalhm的一次性答案,我也不认为“可观测”也不是一个优雅的解决方案。例如,您可以使用switchmap管道链接您的答案,并立即发送api请求。。。把它想象成一个角度的httpclient,即使它是唯一的一次回答,它仍然返回可观察的结果。但是无论如何,如果你仍然需要承诺,你可以看看这个链接,有没有一篇文章可以让我找到可观察的方法?或者你可以问一下,这样我就可以投票并检查它。我在你回答之前做的几乎一样,但在再次打开它之后,我会得到两个结果,所以你的完整方法,现在很优雅。非常感谢你!