javascript - 在 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 或主题来做到这一点。但,
解决方案
如果我更新服务中的数组,则发送我正在监听的这个数组的承诺
then
将再次触发并给我新的更新数组
不,绝对不是。一个承诺只解决一次,点。它不会再次触发,甚至不会注意到数组已更新。
数组和字符串之间的真正区别在于,前者是可变对象,而后者是不可变的原始值。在您的示例代码中,两者this.mainService.data
和都this.componentData
引用完全相同的数组实例。向其推送新值将修改该共享数组,无论您是通过this.componentData.push(4)
还是. Angular 以某种方式接受了这种变化。this.mainService.data.push(4)
this.mainService.pushData(4)
是的,但是您可以为此使用 observable,它可以触发多次。您需要将它用于您的字符串数据,并且在您的pushData
方法中,您需要将新值显式放入可观察对象中。
推荐阅读
- r - R,fread CSV - 如何维护单元格值中的换行符?
- javascript - Chart.js 如何为每个数据集设置 cutoutPercentages
- django - Heroku 部署成功,但未找到模块
- sql - 确定具有多个设备的表中设备的某些状态的持续时间
- java - 使用 RESTful Web 服务:控制器 Springboot 错误
- apache - .htaccess - 一个特定域的 SSL redicect 条件不起作用
- vue.js - 在 Vue 中,如何使用新的 devBaseUrl 选项?
- java - ClassName.class.getResource() 返回 null
- html - 展开 div 并覆盖其他 div
- jmeter - CSV 数据集在 JDBC 采样器请求之前执行