Javascript 单个值的可观察与承诺

Javascript 单个值的可观察与承诺,javascript,asynchronous,promise,rxjs,observable,Javascript,Asynchronous,Promise,Rxjs,Observable,Typescript(现在也是ECMAScript 2017)以async/await的形式为您提供了非常好的异步工具。然而,在使用Angular 4时,我感觉使用可观测的是首选。我的问题是:当我有一个函数一次返回一个单一值时(例如:确认模式),使用Observable有什么大的好处,或者Promissions(异步/等待)会更可取/同样好吗?使用可见光不是很奇怪吗?它们不代表价值流吗 Tl;博士: async showDialog(msg: string): Promise<Dialog

Typescript(现在也是ECMAScript 2017)以async/await的形式为您提供了非常好的异步工具。然而,在使用Angular 4时,我感觉使用可观测的是首选。我的问题是:当我有一个函数一次返回一个单一值时(例如:确认模式),使用Observable有什么大的好处,或者Promissions(异步/等待)会更可取/同样好吗?使用可见光不是很奇怪吗?它们不代表价值流吗

Tl;博士:

async showDialog(msg: string): Promise<DialogResult>
异步showDialog(msg:string):承诺 vs

showDialog(msg:string):可观察

您使用哪一个并不重要。承诺和观察可以自由交换。看看这个

我个人发现,即使只需要返回一个值,也更容易处理可观察对象

有了承诺,您通常需要保留三项财产:

class Whatever {
  resolve: Function;
  reject: Function;
  promise = new Promise((resolve, reject) => {
    this.resolve = resolve;
    this.reject = reject;
  });    

  method() {
    return this.promise;
  }

  otherMethod() {
    this.resolve();
  }
}
使用可观察对象,您可以只保留主题的一个实例:

class Whatever {
  subject = new Subject();

  method() {
    return this.subject.toPromise();
  }

  otherMethod() {
    this.subject.next(...);
    this.subject.complete();
  }
}

“Typescript以async/await的形式为您提供了非常好的异步工具。”JavaScript也是如此,现在,措辞很好。通过问“…使用可观测数据有什么大的好处…”你是在问具体的信息,而不是意见。默认使用与您的用例(承诺)完全匹配的东西是很有意义的,并且很容易与其他一次性异步结果(通过
wait
和其他)组合,并且需要具体的理由来做其他事情。显然,ECMAScript 2017支持这一点,感谢您指出,它将编辑这个问题。我的想法是,我最近开始使用Angular,这也是我第一次被介绍给RxJS的时候。让我们看看人们怎么说。谢谢你对措辞的赞美!我认为对于您定义的用例,我看不到使用可观察对象的理由。这篇文章非常清楚地解释了承诺和观察到的东西。好吧,出于几个原因,你不需要这样做,尤其是在通常情况下,你不会有一个承诺作为实例属性;它们是特定于行动的
method
将只返回承诺并调用相应的结算函数。但是,如果您需要它作为实例属性,那么包装或扩展
Promise
(一次,可重用)就很容易了,因此您只需跟踪一件事。实际上,这通常是最简单的方法,而无需创建扩展默认
Promise
类。但是如果您必须定期这样做,扩展或包装Promise将是正确的解决方案——因为您似乎不想跟踪三个单独的属性。是的,所以基本上您将使用主题。不,有很大的语义差异。这是问题中提出的要点。如果我使用的API返回
Subject,0…n,并且如果我没有误读,则不会本质上区分值和错误
Promise
表示它只返回一个值或一个错误,区分这两个值,并保证其中一个(值或错误)会发生。
class Whatever {
  subject = new Subject();

  method() {
    return this.subject.toPromise();
  }

  otherMethod() {
    this.subject.next(...);
    this.subject.complete();
  }
}