Javascript 从另一个异步函数中调用一个异步函数以并行运行

Javascript 从另一个异步函数中调用一个异步函数以并行运行,javascript,asynchronous,Javascript,Asynchronous,我有一个工作的异步函数作为主代码(异步函数(){…}),处理来自reed contacts的一些输入,将其发布到云中。到目前为止一切都很好 现在我想添加一个功能,分析簧片是否打开超过x秒。如果是这样的话,我想做一些额外的事情,但仍然在听其他的输入。所以我尝试的是: var threshold; async function time(threshold){ var sec = 0; var start = new Date(); //set time stamp while (se

我有一个工作的异步函数作为主代码
(异步函数(){…}),处理来自reed contacts的一些输入,将其发布到云中。到目前为止一切都很好

现在我想添加一个功能,分析簧片是否打开超过x秒。如果是这样的话,我想做一些额外的事情,但仍然在听其他的输入。所以我尝试的是:

var threshold;

async function time(threshold){
  var sec = 0;
  var start = new Date(); //set time stamp
  while (sec < threshold){
      // take actual time
      var akt = new Date();
      // calc difference
      var diff = akt.getTime() - start.getTime();
      // calc secs from mills
      sec = Math.floor(diff / 1000);
  } 
  post threshold data to cloud;
  return "Threshold reached";
}

(async function () {

  reading reed permanent {

    if (reed === 1){
      post data to cloud;
      var call = time(20);
      console.log(call);
    }
  }
})();

首先,我将解释您的代码有什么问题,然后我将给您一些我认为更好、更简单的解决方案:

您的
time
函数被标记为async,但实际上它不执行任何异步操作。这实际上意味着,当函数“返回”时,它实际上返回一个已解析的承诺。但是承诺只在最后创建并立即解析,因此它不需要异步

我相信这样做应该会奏效:

async function time(threshold){
   return new Promise( (resolve, reject) => {
     var sec = 0;
     var start = new Date(); //set time stamp
     while (sec < threshold){
        // take actual time
        var akt = new Date();
        // calc difference
        var diff = akt.getTime() - start.getTime();
        // calc secs from mills
        sec = Math.floor(diff / 1000);
     } 
     post threshold data to cloud;
     resolve("Threshold reached)";
   }
}

我在
time
函数中没有看到任何异步操作。因此,一旦它开始运行,它就不会将执行返回到事件循环。您可以简单地使用
setTimeout
而不是新实现的
time
函数。但是,如果您不想等待时间函数完成,请不要等待它。@tehhowch似乎
将阈值数据发布到云
是异步调用。哦,那
time()
函数太难看了,它在那个时候阻塞了整个线程。相反,使用
const timer=ms=>new Promise(res=>setTimeout(res,ms))
,然后
wait timer(20)
@AZ_u
中缺少异步操作是我的观点。好吧,这让我更进一步。现在我有一个确切的问题,我需要验证特定的簧片是否仍然打开。为此,我定义了一个数组并将时间戳存储在其中。当超时结束时,我想验证时间戳是否与超时一样旧,或者它是否同时被更改(由于再次克隆了特定的reed…但不知怎么的,它不起作用…我也不知道。-->我添加了上面修改过的代码。@Tom这有点难以回答,因为我不知道您在哪个环境/框架中工作,您的数据流等,所以很难给出特定的内容。一般来说,我会按照事件emi来尝试例如,tting—在达到超时时发出一个事件,并在您可以访问当前里德状态的作用域中的某个位置添加一个侦听器。然后,您可以在事件函数中检查里德是否仍然打开,然后您升起一个不断被检查的标志,如果它升起—您完成任务并将其带回下一个iter再次强调。@Tom,这是一个非常笼统的问题,但我希望您能理解。如果您的代码中没有或无法实现事件发射,我建议您提出一个新问题,详细介绍任务的总体情况、您工作的环境,并更好地描述新问题,我们可以尝试在这方面提供帮助:)另外,如果我的回答对你有帮助,不要忘记勾选绿色的V,并将其标记为已接受:D
async function time(threshold){
   return new Promise( (resolve, reject) => {
     var sec = 0;
     var start = new Date(); //set time stamp
     while (sec < threshold){
        // take actual time
        var akt = new Date();
        // calc difference
        var diff = akt.getTime() - start.getTime();
        // calc secs from mills
        sec = Math.floor(diff / 1000);
     } 
     post threshold data to cloud;
     resolve("Threshold reached)";
   }
}
(async function () {

  reading reed permanent {

    if (reed === 1){
      post data to cloud;
      setTimeout( () => { if(reed still open) {/*do what you want after timeout*/}  }, 20 );
    }
  }
})();