как сделать несколько обещаний вызова в машинописи - PullRequest
0 голосов
/ 23 января 2020

Здравствуйте, мне нужно сделать несколько обещаний, но я застрял, в основном я получаю данные из службы сокетов, которые общаются через Modbus / TCP. Я смог связаться через плагин Cordova, но у меня возникли проблемы с пониманием того, как работают обещания, вот код:

    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 ]

2 голосов
/ 23 января 2020

Я не понимаю всех ваших вопросов, но ваша проблема, похоже, связана только с Обещаниями.

Если вы хотите связать свои Обещания в цепочку, вы должны вернуть решение * (с вашими данными здесь *) как это:

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 голосов
/ 23 января 2020

Я настоятельно рекомендую вам довольно простые примеры того, как работают обещания, просто чтобы понять, как работают обещания.

Как вы можете видеть, Обещания всегда являются лучшим вариантом для решения большинства проблем SYN C (в основном это проблема, которая у вас есть :)), позже вы можете начать видеть libs как RX JS - Angular, чтобы начать решать эти проблемы.

Совет : Всегда круто сделать небольшой обзор основных понятий, чтобы понять реализации высокого уровня некоторых библиотек. И потому, что это круто учиться или помнить то, что мы изучаем долгое время go! Не стесняйтесь спрашивать что-нибудь! :)

1 голос
/ 23 января 2020

Поскольку вы используете Angular, я бы посоветовал вам использовать rx js Observables вместо Обещаний. Наблюдаемые - не самая простая концепция для gr asp, но они довольно мощные.

Если вы хотите продолжать выполнять обещания, может помочь синтаксис async / await (вместо этого потеряться в выражениях .then (). then ()).

Чтобы ответить на вопрос «многообещающий вызов»;

  • Если ваши запросы не зависят от ответов других запросов, вы можете запустить их вместе, используя функцию Promise.all () .
  • Если Ваши запросы зависят от результатов предыдущих запросов, поэтому может оказаться полезным просмотреть документацию по асинхронному ожиданию / ожиданию из MDN (уже связанной).

Дайте мне знать, если я могу помочь с чем-либо. Удачи. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...