Javascript заставляет функцию ждать другую функцию, прежде чем продолжить - PullRequest
0 голосов
/ 23 сентября 2019

Привет, у меня есть эта функция, которую я написал.

Метод GetIndex

  getIndex(req: connreq){
  var found = false;
  var number =0;
  this.firereq.child(req.recipient).once('value', function(snapshot) {
    if (!snapshot.exists()) {
      console.log('Not exists');
      this.x = '0';
    }
  });

  }

И я называю это в этой функции.

Метод SendCommand

 async sendcommand(req: connreq, cmd: string) {
this.getIndex(req);
  var promise = new Promise((resolve, reject) => {
    this.firereq
    .child(req.recipient)
    .child(this.x) .set({
      sender: req.sender,
      Command: cmd,
    })
    .then(() => {
      resolve({ success: true });
    })
    .catch(err => {
      resolve(err);
    });
    });
      return promise;


}

Однако, похоже, что вторая функция продолжается до завершения метода getIndex.Я предполагаю, что мы можем использовать ожидание и обещание, чтобы заставить функцию sendcommand дождаться завершения Getindex, прежде чем приступить к остальным задачам.Любая помощь будет оценена

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

В первой функции выполните следующее:

 getIndex(req: connreq){
  return new Promise((resolve, reject) =>
  let found = false;
  let number =0;
  this.firereq.child(req.recipient).once('value', function(snapshot) {
    if (!snapshot.exists()) {
       reject("not exists");
      console.log('Not exists');
      this.x = '0';
       }
    else{
       resolve(snapshot.val());
         }
      });
    });
  }

Затем вы можете сделать:

 async sendcommand(req: connreq, cmd: string) {
this.getIndex(req).then((data)=>
  {
  var promise = new Promise((resolve, reject) => {
    this.firereq
    .child(req.recipient)
    .child(this.x) .set({
      sender: req.sender,
      Command: cmd,
    })
    .then(() => {
      resolve({ success: true });
    })
    .catch(err => {
      resolve(err);
    });
    });
    });
      return promise;


}

Таким образом getIndex() вернет обещание, и все, что будет then()будет выполнено после getIndex() возвратов.

1 голос
/ 23 сентября 2019

Возврат Promise из getIndex и await это в sendCommand функция

    getIndex(req: connreq){
      return new Promise((resolve, reject) => {
      var found = false;
      var number =0;
      this.firereq.child(req.recipient).once('value', function(snapshot) {
        if (!snapshot.exists()) {
          console.log('Not exists');
          this.x = '0';
        }
      });

      resolve();
      }
    });

и

    async sendcommand(req: connreq, cmd: string) {
        await this.getIndex();
        ....
    }
1 голос
/ 23 сентября 2019

Вернуть обещание в методе getIndex () и выполнить второе при обратном вызове.Таким образом, в общем случае getIndex должен быть:

getIndex(req: connreq){
    return new Promise((resolve,reject) =>
    {
        var found = false;
        var number =0;
        this.firereq.child(req.recipient).once('value', 
        function(snapshot) {
           if (!snapshot.exists()) {
               console.log('Not exists');
               this.x = '0';
               reject('Not exists');
            }
            resolve('exists');
        });
     });
}

Вышеприведенный вызов запустит блок catch, если не найден, и блок then, если найден, так что обычно это должно быть:

this.getIndex(req)
.then(() => {
    this.firereq
    .child(req.recipient)
    .child(this.x) .set({
          sender: req.sender,
          Command: cmd,
    })
    .then(() => {
       resolve({ success: true });
     })
    .catch(err => {
       resolve(err);
    })
})
.catch(err => {
  resolve(err);
});
...