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

时间:2019-08-05 11:10:32

标签: javascript asynchronous

我有一个有效的异步功能作为主要代码(async function (){...});,可以处理来自芦苇联系人的一些输入,并将它们发布到云中。到目前为止一切都很好。

现在,我想添加功能来分析芦苇张开的时间是否超过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循环应等待阈值并并行执行。

但是我的代码要等到阈值才能继续。 我该如何并行处理?


在Gibors帮助之后进行编辑:

现在,我停留在验证簧片是否仍处于打开或关闭状态的关键点。即使同时关闭簧片,我也总是得到diff > threshold,以便时间戳记应该更新。

var id = [];
if (value['contact'] === 1) {
              var bool = "false";
              id[device['manufacturer']] = new Date();
            } else if(value['contact'] === 0) {
              var bool = "true";
              id[device['manufacturer']] = new Date();
              setTimeout( () => {
                var akt = new Date();
                var diff = akt.getTime() - id[device['manufacturer']].getTime();
                if (diff > threshold) {

                  console.log("now: " + diff + "=" + akt.getTime() + "-" + id[device['manufacturer']].getTime());
                }
              }, threshold);
              /*var call = time (50);
              console.log(call);*/
            }
    ```


1 个答案:

答案 0 :(得分:1)

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

您的time函数被标记为异步,但实际上并没有执行任何异步操作。这实际上意味着,当函数“返回”时,它实际上返回了已解决的承诺。但是promise只在最后创建并立即解决,因此它不会做异步工作。

我相信这样的方法应该可行:

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)";
   }
}

现在这将并行运行,并且call变量将仅在承诺被解决时获得字符串“达到阈值”-这意味着在当前代码中,您将获得的日志类似于{{1 }}。 要仅在完成时记录日志(并执行其他操作),请对Promise<pending>持有的诺言使用.then

您应该注意的一件事是,您必须以某种方式在call状态(我并没有真正得到它的真实含义,但我认为它无关紧要)和promise状态之间进行同步,因为您想在20秒结束后执行超时后代码,并且簧片仍处于打开状态,所以您必须在reed子句中进行检查,或者将其传递给时间函数,该函数将拒绝承诺如果.then状态在时间用完之前改变了,等等。

现在-对于简单的解决方案:在我看来,使用setTimeout函数会更好:

  

setTimeout()方法设置一个计时器,一旦计时器到期,该计时器将执行功能或指定的代码。

因此您可以简单地执行以下操作:

reed