目标是定期将采样数据作为对象推送到阵列上,并在完成后等待将新阵列注销到控制台。
我是JS的新手,请放轻松;)。我可能会使这变得比需要的复杂。以为它就像for循环中的setTimeout()
一样简单。
使用IIFE和下面的setTimeout()
和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()
函数生成的数组起作用,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();
答案 0 :(得分:1)
基本思想是在setInterval
运行足够的迭代后返回承诺并解决承诺。您可以在单个函数中执行以下操作(使用额外的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)
答案 1 :(得分:0)
我将隔离延迟部分(异步)部分,并为此创建一个单独的通用函数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);
答案 2 :(得分:0)
我刚开始使用生成器函数的另一种方式
function* simpleGenerator(){
var index = 0;
while (true)
yield {tag: index++, time: Date.now()}
}
var gen = simpleGenerator();
..与相应的推送
arr.push(gen.next().value);