如何解决解决或订户在承诺或可观察中真正意味着什么?
我想消除对诺言和可观察性的怀疑。我知道promise和observables用于编写异步代码。但是,当数组或字符串发生更改时,我可以使用它们来获得通知吗?例如,在Angular中,我有一个服务和一个组件。该服务具有一个数组和一个Promise:
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,3,4]。然后我使用componentData = data进行设置。但是,由于某种原因,如果我有一个字符串而不是一个数组,则promise不会使用组件中字符串的新值再次解析。这很奇怪,因为当我更改数组时,promise确实解析了新值。那是什么原因呢?我可以使用promise或observable来监视数组或字符串上的更改吗?我知道我可以使用EventEmitter或主题来做到这一点。但是,我想知道Promise中的resolve真正给了我们什么,以及Promise是否会在每次更改时自动重新解析数组或字符串。
解决方法
如果我在服务中更新了数组,则向我发送
then
所监听的数组的诺言将再次触发并为我提供新的更新后的数组
不,绝对不是。一个承诺只能解决一次。它不会再次触发,甚至不会注意到该数组已更新。
数组和字符串之间的真正区别在于,前者是可变对象,而后者是不可变的原始值。在示例代码中,this.mainService.data
和this.componentData
都引用完全相同的数组实例。向其推送新值将修改该共享数组,无论您是通过this.componentData.push(4)
,this.mainService.data.push(4)
还是this.mainService.pushData(4)
进行操作。是Angular以某种方式获得了这一变化。
是的,但是您可以为此使用观察值,可以触发多次。您需要将其用于字符串数据,然后在pushData
方法中需要将新值显式地放入可观察值中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。