【问题标题】:Async / Await cause a loopAsync / Await 导致循环
【发布时间】:2020-05-30 23:28:18
【问题描述】:

我尝试使用 Async / Await 而不是 .then() 与承诺。 使用 .then() 方法,我的代码可以正常工作...

当我将其更改为 Async / Await 时,我得到了一个循环

另一个问题:如何在我的 console.log() 中禁用 Promise?

谢谢............

ASCBY1
state:2
ASCBY1
state:2
ASCBY1
Promise { <pending> }
state:2
ASCBY1
state:2
ASCBY1
state:2
ASCBY1
state:2
ASCBY1
state:2
ASCBY1
state:2
ASCBY1
Promise { <pending> }
state:2
ASCBY1
state:2
ASCBY1
state:2
ASCBY1
state:2
ASCBY1
Promise { <pending> }
state:2
ASCBY1
state:2
ASCBY1
Promise { <pending> }
state:2
ASCBY1
state:2
ASCBY1
state:2

**这很好用**

  
  
  private innerLoop(i,ifArray,counter,cb){
    let tempMod = new Module(null, ifArray[i].id,ifArray[i].type);
    /*FALLS CHCEK BY MODULE*/

    if(ifArray[i].timerID === 0){ //WENN ein Timer ausgeführt iwrd, dann gibt es kein Modul bzw. kein DevType, er muss aber dennoch durch alle Schleifen (ifArray) laufen. Ohne der && this.mod.... würde er bei switch case ein Fehler ausspucken weil es den DevType nicht gibt.
      if(!(this.mod === undefined)){
      //  var tempMod = new Module(ifArray[i].id,ifArray[i].type);
        setTimeout(()=>console.log(tempMod.getState()),1000);
        switch (this.mod.modulesRecievedData.DevType){
           case 0x0b:{
             if(this.mod.checkMultiSwitch(ifArray[i])){
               counter++;
             }
             break;
           }
           case 0x02:{
              console.log("ASCBY1");

              tempMod.getState().then((state)=>{
                if(state == 2) counter++;

                console.log("state:"+state);

                if(i < ifArray.length){//NUR WENN TIMERID == 0 ist, sonst zählt er den Timer mit obwohl da keine ID + type dahinter steckt.
                  this.innerLoop(i,ifArray,counter,cb);
                }else{
                  cb(counter);
                }
              });


              break;
           }
        }
        i++;
      }
    }else if(ifArray[i].timerID > 0){  /*FALLS CHECK BY TIMER*/
      var timerOnState = time[ifArray[i].timerID].timerOnState;
      if(timerOnState == true){
        counter++;
      }
      i++;
      if(i < ifArray.length){//NUR WENN TIMERID == 0 ist, sonst zählt er den Timer mit obwohl da keine ID + type dahinter steckt.
        this.innerLoop(i,ifArray,counter,cb);
      }else{
         console.log("counter3 "+counter);
        cb(counter);
      }
    }
  }

这引起看看

private async innerLoop(i,ifArray,counter,cb){
    let tempMod = new Module(null, ifArray[i].id,ifArray[i].type);
    /*FALLS CHCEK BY MODULE*/

    if(ifArray[i].timerID === 0){ //WENN ein Timer ausgeführt iwrd, dann gibt es kein Modul bzw. kein DevType, er muss aber dennoch durch alle Schleifen (ifArray) laufen. Ohne der && this.mod.... würde er bei switch case ein Fehler ausspucken weil es den DevType nicht gibt.
      if(!(this.mod === undefined)){
      //  var tempMod = new Module(ifArray[i].id,ifArray[i].type);
        setTimeout(()=>console.log(tempMod.getState()),1000);
        switch (this.mod.modulesRecievedData.DevType){
           case 0x0b:{
             if(this.mod.checkMultiSwitch(ifArray[i])){
               counter++;
             }
             break;
           }
           case 0x02:{
              console.log("ASCBY1");
              ///////////////////////////////////
              //////HERE IS THE CHANGE///////////
              ///////////////////////////////////
              let state = await tempMod.getState();

              if(state == 2) counter++;

              console.log("state:"+state);

              if(i < ifArray.length){//NUR WENN TIMERID == 0 ist, sonst zählt er den Timer mit obwohl da keine ID + type dahinter steckt.
                this.innerLoop(i,ifArray,counter,cb);
              }else{
                cb(counter);
              }
              break;
           }
        }
        i++;
      }
    }else if(ifArray[i].timerID > 0){  /*FALLS CHECK BY TIMER*/
      var timerOnState = time[ifArray[i].timerID].timerOnState;
      if(timerOnState == true){
        counter++;
      }
      i++;
      if(i < ifArray.length){//NUR WENN TIMERID == 0 ist, sonst zählt er den Timer mit obwohl da keine ID + type dahinter steckt.
        this.innerLoop(i,ifArray,counter,cb);
      }else{
         console.log("counter3 "+counter);
        cb(counter);
      }
    }
  }

模块类

	getState(){
		let promise = new Promise((resolve)=>{
			this.db.getStateOfModule(this._id,this._type,
				(data)=>{this._state = data[0].state; resolve(data[0].state);}
			);
		});

		return promise;
	}

【问题讨论】:

    标签: javascript typescript promise async-await


    【解决方案1】:

    Module.getState 返回一个承诺。

    线路setTimeout(()=&gt;console.log(tempMod.getState()),1000); 正在等待 1000 毫秒,然后控制台记录 tempMod.getState() 的结果,这是一个未解决的承诺。

    如果您不想在控制台中获得Promise { &lt;pending&gt; }。你可以改成

    setTimeout(() => tempMod.getState().then((result) => {
      console.log(result)
    }), 1000);
    

    至于循环问题。当您使用.then() 时。 .then() 之后的其余代码将立即运行。特别是i++。只有 then 回调中的代码会被延迟。

    当您将其更改为 await 时。整个函数将停止执行,直到 promise 解决。这意味着i++ 不会被执行。

    我假设 ifArray.length 是 1,我从 0 开始。所以当你到达 if(i &lt; ifArray.length){ 时,这将是真的,当使用 await 时(因为 i++ 没有执行)这将导致再次调用 innerLoop。 同样的事情将继续发生,因为i++ 永远不会被执行。

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 2016-12-30
      • 2016-02-04
      • 2019-07-16
      • 1970-01-01
      • 2020-08-03
      • 2017-04-29
      • 1970-01-01
      相关资源
      最近更新 更多