首页 > 解决方案 > 在 promise 或 observable 中,resolve 或subscriber 的真正含义是什么?

问题描述

我想澄清我对 Promise 和 observables 的疑虑。我知道 promises 和 observables 用于编写异步代码。但是,我可以使用它们在数组或字符串更改时获得通知吗?例如,在 Angular 中,我有一个服务和一个组件。该服务有一个数组和一个承诺:

export class MainService{
 data: number[]=[1,2,3] 
 dataPromise(){
  return new Promise((resolve,reject)=>{resove(this.data)})
 }
 pushData(number: number) {
  this.data.push(number)
 }
}

并且,该组件在 ngOnInit 上获得此承诺,并将其变量之一设置为该承诺返回的服务数组:

export class AppComponent implements OnInit{
 componentData: number[];
 constructor(private mainService: MainService){}
 ngOnInit(){
  this.mainService.dataPromise.then((data:number[])=>{this.componentData = data})
 }
 onClick(){
  this.mainService.pushData(4)
 }
}

因此,如果我们将函数 onClick() 与一些 HTML 连接并触发它,则 4 将添加到服务上的数据数组中。而且,如果我更新服务中的数组,那么在我的组件 ngOnInit() 中返回这个数组的承诺将再次触发并给我更新后的数组,即 [1,2,3,4]。然后我使用 componentData=data 设置。但是,出于某种原因,如果我有一个字符串而不是一个数组,则承诺不会再次使用我的组件中字符串的新值来解析。这很奇怪,因为当我更改数组时,promise 确实解析了新值。那么,是什么原因呢?我可以使用 promise 或 observable 来观察数组或字符串的变化吗?我知道我可以使用 EventEmitter 或主题来做到这一点。但,

标签: javascriptangularpromise

解决方案


如果我更新服务中的数组,则发送我正在监听的这个数组的承诺then将再次触发并给我新的更新数组

不,绝对不是。一个承诺只解决一次,点。它不会再次触发,甚至不会注意到数组已更新。

数组和字符串之间的真正区别在于,前者是可变对象,而后者是不可变的原始值。在您的示例代码中,两者this.mainService.data和都this.componentData引用完全相同的数组实例。向其推送新值将修改该共享数组,无论您是通过this.componentData.push(4)还是. Angular 以某种方式接受了这种变化。this.mainService.data.push(4)this.mainService.pushData(4)

是的,但是您可以为此使用 observable,它可以触发多次。您需要将它用于您的字符串数据,并且在您的pushData方法中,您需要将新值显式放入可观察对象中。


推荐阅读