您好,我必须进行多个promise调用,但是我被卡住了,基本上我是从套接字服务中获取数据的,该套接字服务通过modbus / TCP进行通信。我可以通过cordova插件进行通信,但是在理解Promise的工作方式时遇到了一些问题,这里有一些代码:
ngOnInit() {
console.log('init')
this.getRegistrationNumber().then(() => {
this.swVersionRequest()
})
}
getRegistrationNumber() {
let self = this
return new Promise(function(resolve, reject) {
self.socketService.getMatricola().then((data: any) => {
self.registrationNumber = self.socketService.arrayBuffer2str(data.data.slice(3, data.data.length-2))
console.log(`Registration number is ${self.registrationNumber}`)
resolve()
})
.catch(error => {
reject(error)
})
})
}
swVersionRequest() {
console.log("software version request");
this.socketService.getSwVersion().then((data: any) => {
this.softwareVersionWifiGsm = this.socketService.arrayBuffer2str(data.data.slice(3, data.data.length-2))
this.softwareVersionWifiGsm = this.softwareVersionWifiGsm.substring(0, 2).split('').join(".") + ' ' + this.transformSwVersion(this.softwareVersionWifiGsm.substring(2, this.softwareVersionWifiGsm.length))
console.log(`Software version is ${this.softwareVersionWifiGsm}`)
})
}
getMachineType() {
console.log('get machine type')
this.socketService.getMachineType().then((data: any) => {
this.machineType = data.data.slice(4, data.data.length-2)
console.log(`Machine type is ${this.machineType}`)
})
}
refreshData() {
this.getRegistrationNumber().then(() => {
this.swVersionRequest()
})
.then(() => { // not working like this
this.getMachineType()
})
}
transformSwVersion(str: any) {
return str.replace(/(\d\d)(\d\d)(\d\d)/, "$1/$2/$3")
}
然后,当我获得machineType时,我想检查一下来自诸如此类的承诺的响应:
if (this.machineType == 2) {
callSoftwareVersionB() // another promise
} else {
callSoftwareVersionC() // another promise
}
我不清楚是否清楚
提前谢谢
答案 0 :(得分:2)
我无法理解您的所有问题,但您的问题似乎仅与承诺有关。
如果要链接您的Promises,您必须像下面这样返回resolve *(此处有数据*):
return new Promise(function(resolve, reject) {
return self.socketService.getMatricola().then((data: any) => {
self.registrationNumber = self.socketService.arrayBuffer2str(data.data.slice(3, data.data.length-2))
console.log(`Registration number is ${self.registrationNumber}`)
return resolve(withYourDataHere)
})
之后,您将可以链接您的诺言并获得如下结果:
getRegistrationNumber().then((yourData) => {
console.log(yourData);
return yourData;
});
如果不需要上一个响应来执行下一个请求,则可以执行Promise.all()。
例如,您可以这样做:
const promises = [];
promises.push(getRegistrationNumber());
promises.push(getMachineType());
//etc...
return Promise.all(promises).then(() => {
//your code will be executed after all your requests are resolved
})
在您的情况下:
refreshData() {
this.getRegistrationNumber().then(() => {
this.swVersionRequest()
})
.then(() => { // not working like this
this.getMachineType()
})
}
此代码变为:
swVersionRequest() {
console.log("software version request");
return this.socketService.getSwVersion().then((data: any) => {
this.softwareVersionWifiGsm = this.socketService.arrayBuffer2str(data.data.slice(3, data.data.length-2))
this.softwareVersionWifiGsm = this.softwareVersionWifiGsm.substring(0, 2).split('').join(".") + ' ' + this.transformSwVersion(this.softwareVersionWifiGsm.substring(2, this.softwareVersionWifiGsm.length))
console.log(`Software version is ${this.softwareVersionWifiGsm}`)
})
}
getMachineType() {
console.log('get machine type')
return this.socketService.getMachineType().then((data: any) => {
console.log(`Machine type is ${this.machineType}`)
return this.machineType = data.data.slice(4, data.data.length-2)
})
}
refreshData() {
return this.getRegistrationNumber().then(() => {
return this.swVersionRequest().then(() => {
return this.getMachineType() //you can chain that if you change the return in your function
})
})
}
OR
refreshData() {
const promises = [];
promises.push(this.getRegistrationNumber());
promises.push(this.swVersionRequest());
promises.push(this.getMachineType());
return Promise.all(promises).then(() => {
//type your code here
})
}
我同意saglamcem,您拥有在MDN上执行此操作所需的所有文档,并且还可以使用Observables。
希望我们能帮助您。
答案 1 :(得分:2)
我强烈建议您一些简单的示例,以了解诺言如何工作,只是为了了解诺言如何工作。
如您所见,Promises始终是处理大多数SYNC问题(基本上是您那里存在的问题:)的更好的选择,后来您可以开始将libs视为RXJS - Angular来开始解决这些问题。
建议:总是很酷,对基础概念进行一些回顾,以了解某些库的高级实现。而且因为学习很酷,或者记住我们很久以前学到的东西!随便问什么! :)
答案 2 :(得分:1)
由于您使用的是Angular,因此建议您使用rxjs Observables而不是Promises。观察值不是最容易掌握的概念,但是功能却很强大。
如果您希望遵守承诺,那么async/await语法可能会有所帮助(而不是在.then()。then()语句中迷失方向)。
回答“多重承诺电话”问题;
让我知道我是否可以提供任何帮助。祝好运。 :)