【问题标题】:Javascript make function wait for another function before continuingJavascript让函数在继续之前等待另一个函数
【发布时间】:2019-09-23 12:00:09
【问题描述】:

你好,我有这个函数,我已经写了。

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 方法完成之前继续。我假设我们可以使用 awaits 和 promises 来强制 sendcommand 函数等待 Getindex 完成,然后再继续它的其余任务。任何帮助将不胜感激

【问题讨论】:

  • 同理sendcommand被promisified,你也可以promisifygetIndex

标签: javascript firebase promise async-await


【解决方案1】:

在 getIndex() 方法中返回一个 promise 并在 then 回调中执行第二个。所以一般来说,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);
});

【讨论】:

    【解决方案2】:

    在第一个函数中执行以下操作:

     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() 将返回一个promise,并且then() 中的所有内容都将在getIndex() 返回后执行。

    【讨论】:

      【解决方案3】:

      sendCommand函数中从getIndexawait返回Promise

          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();
              ....
          }
      

      【讨论】:

        猜你喜欢
        • 2012-03-06
        • 2017-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        相关资源
        最近更新 更多