【问题标题】:how to make multiple promises call in typescript如何在打字稿中进行多个承诺调用
【发布时间】:2020-01-23 22:05:12
【问题描述】:

您好,我必须调用多个 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 时,我想检查来自 promise 的响应,可能是这样的:

if (this.machineType == 2) {
   callSoftwareVersionB() // another promise
} else {
   callSoftwareVersionC() // another promise
}

不知道是不是很清楚

提前谢谢你

【问题讨论】:

    标签: javascript angular promise


    【解决方案1】:

    我不明白你的所有问题,但你的问题似乎只与 Promises 有关。

    如果你想链接你的 Promise,你必须像这样返回 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
         })
       })
    }
    

    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。

    希望我们能帮到你。

    【讨论】:

    • 谢谢,我也试试。耐心点,我还在学习:)谢谢
    【解决方案2】:

    我强烈推荐你一些非常简单的例子,这些例子是如何工作的,只是为了了解 Promises 是如何工作的。

    如您所见,Promises 始终是处理大多数 SYNC 问题的更好选择(这基本上就是您遇到的问题 :)),稍后您可以开始将 libs 视为RXJS - Angular 以开始解决这些问题.

    建议: 回顾一些基本概念,了解一些库的高级实现总是很酷。并且因为很酷的学习,或者记住我们很久以前学过的东西!随便问什么! :)

    【讨论】:

      【解决方案3】:

      由于您使用的是 Angular,我建议您使用 rxjs Observables 而不是 Promises。 Observables 不是最容易掌握的概念,但它们非常强大。

      如果您想继续使用 Promise,async/await 语法可能会有所帮助(而不是迷失在 .then().then() 语句中)。

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

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

      如果我能提供任何帮助,请告诉我。祝你好运。 :)

      【讨论】:

      • 首先,感谢您的回答。我正在考虑使用 RxJS 的 observables,我想尝试一下,因为我将重构这部分代码。在这种情况下,我将如何使用 promiseAll?或者,如果你能告诉我如何在这种情况下使用 observables,那就太好了。谢谢
      • @sebba23 ClementRsln 的回答似乎具有包容性,所以我的好心建议是(正如 vdsancheza 指出的那样)从充分学习基础知识开始,然后继续使用 Observables。我肯定会在 Observables 上学习更多,因为 Angular 在内部使用 rxjs(以及 observables)。一步一步走,按照自己的节奏,对promise有了清晰的认识后,就可以选择自己的路了。 :) 祝你好运!
      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 2020-03-10
      • 2018-12-19
      • 1970-01-01
      • 2016-12-28
      • 2018-02-04
      • 1970-01-01
      • 2019-09-08
      相关资源
      最近更新 更多