如何在打字稿中做出多个承诺

时间:2020-01-23 13:33:54

标签: javascript angular promise

您好,我必须进行多个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
}

我不清楚是否清楚

提前谢谢

3 个答案:

答案 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()语句中迷失方向)。

回答“多重承诺电话”问题;

  • 如果您的请求不依赖于其他请求的响应,则可以使用Promise.all()功能一起运行它们。
  • 如果您的请求取决于先前请求的结果,那么查看MDN(已链接)的async / await文档可能会很有帮助。

让我知道我是否可以提供任何帮助。祝好运。 :)