ForEach 内部的 Angular2 延迟
Angular2 delay inside ForEach
我在 angular2 中有一个应用程序,我必须在其中重现事件的历史记录。
所以,当我按下 PLAY 按钮时,它必须从第一个事件开始,在那里停留 3 秒,然后转到下一个事件,再在那里停留 3 秒,然后是下一个,依此类推。
事件列表是动态的。
关键是,用简单的setTimeOut
这是行不通的,我想知道是否有另一种方法可以解决我需要的问题。
我试过这个:
play() {
if (this.history !== undefined) {
this.playMode = true;
const allEvents = this.history;
const historyLength = allEvents.length;
const progressInterval = 100 / historyLength;
allEvents.forEach(e => {
console.log(e);
setTimeout(t => {
this.progress += progressInterval;
}, 3000);
});
}
}
我需要 this.progress 变量来显示 mat-progress-barr
中的进度
<mat-progress-bar *ngIf="playMode" strokeWidth="0.5" mode="determinate" [value]="progress" color="accent"></mat-progress-bar>
显然我的代码没有按我想要的方式运行。
我该怎么做 "delay"?
看起来你所有的超时都安排在同一时刻。试试这个:
play() {
if (!this.history) {
return;
}
const allEvents = this.history;
const historyLength = allEvents.length;
const progressInterval = 100 / historyLength;
this.playMode = true;
allEvents.forEach((event, index) => {
setTimeout(() => {
console.log(event);
this.progress += progressInterval;
}, 3000 * index);
});
}
请注意,我们现在使用 forEach
提供的索引来将超时偏移 3 秒。第一个将立即触发 (3000 * 0 = 0)
。如果不需要,您可以简单地向索引添加一个 setTimeout(() => {...}, 3000 * (index + 1))
.
您可以通过普通的数组索引表示法使用它,而不是使用 forEach 循环。这是一个例子
play() {
if (this.history !== undefined) {
this.playMode = true;
const allEvents = this.history;
const historyLength = allEvents.length;
const progressInterval = 100 / historyLength;
/*allEvents.forEach(e => {
console.log(e);
setTimeout(t => {
this.progress += progressInterval;
}, 3000);
});*/
this.incrementProgress(allEvents, 0, progressInterval);
}
}
incrementProgress(allEvents: any[], index: number, interval: number): void {
if (allEvents.length <= 0 || index < 0 || index >= allEvents.length) {
return;
}
this.progress += interval;
setTimout(() => this.incrementProgress(allEvents, index + 1, interval), 3000);
}
你可以按照@t8ortotlover 说的去做,但仍然不能保证延迟 3 秒。它会很接近,但不完全是。
你应该使用定时器:
import { timer } from 'rxjs';
const source = timer(3000);
const subscribe = source.subscribe(val => {
// Do something every 3 seconds
});
我在 angular2 中有一个应用程序,我必须在其中重现事件的历史记录。
所以,当我按下 PLAY 按钮时,它必须从第一个事件开始,在那里停留 3 秒,然后转到下一个事件,再在那里停留 3 秒,然后是下一个,依此类推。
事件列表是动态的。
关键是,用简单的setTimeOut
这是行不通的,我想知道是否有另一种方法可以解决我需要的问题。
我试过这个:
play() {
if (this.history !== undefined) {
this.playMode = true;
const allEvents = this.history;
const historyLength = allEvents.length;
const progressInterval = 100 / historyLength;
allEvents.forEach(e => {
console.log(e);
setTimeout(t => {
this.progress += progressInterval;
}, 3000);
});
}
}
我需要 this.progress 变量来显示 mat-progress-barr
<mat-progress-bar *ngIf="playMode" strokeWidth="0.5" mode="determinate" [value]="progress" color="accent"></mat-progress-bar>
显然我的代码没有按我想要的方式运行。
我该怎么做 "delay"?
看起来你所有的超时都安排在同一时刻。试试这个:
play() {
if (!this.history) {
return;
}
const allEvents = this.history;
const historyLength = allEvents.length;
const progressInterval = 100 / historyLength;
this.playMode = true;
allEvents.forEach((event, index) => {
setTimeout(() => {
console.log(event);
this.progress += progressInterval;
}, 3000 * index);
});
}
请注意,我们现在使用 forEach
提供的索引来将超时偏移 3 秒。第一个将立即触发 (3000 * 0 = 0)
。如果不需要,您可以简单地向索引添加一个 setTimeout(() => {...}, 3000 * (index + 1))
.
您可以通过普通的数组索引表示法使用它,而不是使用 forEach 循环。这是一个例子
play() {
if (this.history !== undefined) {
this.playMode = true;
const allEvents = this.history;
const historyLength = allEvents.length;
const progressInterval = 100 / historyLength;
/*allEvents.forEach(e => {
console.log(e);
setTimeout(t => {
this.progress += progressInterval;
}, 3000);
});*/
this.incrementProgress(allEvents, 0, progressInterval);
}
}
incrementProgress(allEvents: any[], index: number, interval: number): void {
if (allEvents.length <= 0 || index < 0 || index >= allEvents.length) {
return;
}
this.progress += interval;
setTimout(() => this.incrementProgress(allEvents, index + 1, interval), 3000);
}
你可以按照@t8ortotlover 说的去做,但仍然不能保证延迟 3 秒。它会很接近,但不完全是。
你应该使用定时器:
import { timer } from 'rxjs';
const source = timer(3000);
const subscribe = source.subscribe(val => {
// Do something every 3 seconds
});