【问题标题】:Creating a Timestamped Object Array for Sampling Data in Javascript?在Javascript中为采样数据创建时间戳对象数组?
【发布时间】:2019-09-16 22:25:47
【问题描述】:

目标是定期将采样数据作为对象推送到数组中,并等待新数组完成后将其记录到控制台。

我是 JS 新手,所以放轻松;)。我可能会让这比它需要的更复杂。认为它就像 for 循环中的 setTimeout() 一样简单。

我已经能够以两种不同的方式生成数组,使用带有setTimeout() 的 IIFE 以及下面的setInterval()。不知道如何让异步等待函数与数组 push() 方法查询长度一起工作。也许这不是一个好方法?


class Sample {
    constructor(tag, timeStamp) {
        this.tag = tag;
        this.timeStamp = Date.now();
    }
}

function arrayGenerator(tag){
    return sampleArr.push(new Sample(tag));
};

function setIntSample(callback, delay, iterations) {
    var i = 0;
    var intervalID = setInterval(function () {
       callback(i);
       if (++i === iterations) {
           clearInterval(intervalID);
       }
    }, delay);
};

上面似乎可以工作console.log()-ing 数组,因为它是在arrayGenerator() 函数中生成的。下面,没有骰子

function resolveAfterArrGeneration(){
    return new Promise(resolve => {
        arrLength = setIntSample(i => {arrayGenerator(i)}, 3000, 5) 
        if (arrLength === 5) {resolve();}
    });
}

async function ans() {
    var answer = await resolveAfterArrGeneration();
    console.log(sampleArr);
}
ans();

【问题讨论】:

    标签: javascript arrays asynchronous timestamp


    【解决方案1】:

    基本思想是在setInterval 运行足够的迭代时返回一个promise 并解决这个promise。你可以在一个函数中使用类似这样的东西(额外的console.logs 来显示这个过程):

    class Sample {
        constructor(tag, timeStamp) {
            this.tag = tag;
            this.timeStamp = Date.now();
        }
    }
    
    function makeSamples(iterations, delay){
        let samples = [], i = 0;
        return new Promise(resolve => {
            let intervalID = setInterval(function () {
               console.log("pushing new sample")
               samples.push(new Sample('tag: ' + i));
               if (++i === iterations) {
                   console.log("finished resolving")
                   clearInterval(intervalID);
                   resolve(samples)
               }
            }, delay);
        })
    }
    
    makeSamples(5, 1000).then(console.log)

    【讨论】:

      【解决方案2】:

      我将隔离延迟部分(异步)部分并为此创建一个单独的通用函数delay()。剩下的就变得简单了,使用async函数和for循环:

      const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
      
      class Sample {
          constructor(tag, timeStamp) {
              this.tag = tag;
              this.timeStamp = Date.now();
          }
      }
      
      async function setIntSample(callback, ms, iterations) {
          const arr = [];
          for (let i = 0; i < iterations; i++) {
             if (i) await delay(ms); // don't delay first time
             arr.push(callback(i));
          }
          return arr;
      }
      
      const newSample = (tag) => new Sample(tag)
      
      console.log("wait for it....");
      setIntSample(newSample, 1000, 5).then(console.log);

      【讨论】:

      • 非常感谢。看起来这样可以很容易地以不同的采样频率并行运行多个进程。
      【解决方案3】:

      我刚刚开始使用生成器函数的另一种方式

      function* simpleGenerator(){
          var index = 0;
          while (true)
              yield {tag: index++, time: Date.now()} 
      }
      var gen = simpleGenerator();
      

      ..配合相应的推送

              arr.push(gen.next().value);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 2013-09-03
        • 2014-12-15
        • 1970-01-01
        相关资源
        最近更新 更多