Javascript 如何在第一次播放声音时才出现假值后才出现真值
我有包含动态布尔值的个人数据。该值是自动生成的,每次都可以为真或假 网页每5秒获取一次数据并进行渲染。如果每个人的值为假,则播放声音 代码如下:Javascript 如何在第一次播放声音时才出现假值后才出现真值,javascript,reactjs,html5-audio,Javascript,Reactjs,Html5 Audio,我有包含动态布尔值的个人数据。该值是自动生成的,每次都可以为真或假 网页每5秒获取一次数据并进行渲染。如果每个人的值为假,则播放声音 代码如下: import React, { Component } from 'react'; import { render } from 'react-dom'; import Sound from './Mp3'; const data = [ { id: '1', name: 'Peter', value: true },
import React, { Component } from 'react';
import { render } from 'react-dom';
import Sound from './Mp3';
const data = [
{
id: '1',
name: 'Peter',
value: true
},
{
id: '2',
name: 'John',
value: false
}
];
class App extends Component {
state = {
results: [],
}
componentDidMount() {
this.getData()
// get data every 5 sec
setInterval(this.getData, 5000);
}
getData = () => {
// generate random value
data[0].value = Math.random() >= 0.5;
data[1].value = Math.random() >= 0.5;
// set results state to data
this.setState({ results: data });
// condition if John or Peter value is false
if (data.some(d => d.value === false)) {
var audio = new Audio(Sound);
// play a sound
audio.play();
}
}
render() {
const { results } = this.state;
return (
<div>
{results.map(item => {
return (
<div key={item.id}>
<div>
Name: {item.name}
</div>
<div>
Value: {item.value.toString()}
</div>
<br />
</div>
)
})}
</div>
);
}
}
render(<App />, document.getElementById('root'));
您可以使用一种“断路器”,它跟踪其状态以及是否启用。跳闸后,它会等待一段时间,然后重新启用自己
下面的代码演示了以下内容
- 从
切换到true
执行false
回调操作
- 继续脉冲
不会重复此操作false
- 切换到
,然后等待比true
超时时间更长的时间,然后再次执行
回调操作
功能TF断路器(超时、动作){
this.state=null;
this.enabled=true;
this.valueChange=函数(newValue){
如果(this.enabled){
if(this.state&&!newValue){
动作();
this.enabled=false;
setTimeout(()=>this.enabled=true,超时);
}
}
this.state=newValue;
}
}
var cb=新的TF断路器(5000,()=>console.log(“播放声音”);
cb.价值变化(真实);
cb.价值变更(假);
cb.价值变化(真实);
cb.价值变更(假);
cb.价值变化(真实);
setTimeout(()=>cb.valueChange(false),6000)代码>您需要在另一个对象的getData函数外部跟踪每个用户以前的值,然后将以前的值与某些对象内部的新值进行比较
state = {
results: []
}
const previousResults = {};
componentDidMount() {
this.getData()
// get data every 5 sec
setInterval(this.getData, 5000);
}
getData = () => {
// generate random value
data[0].value = Math.random() >= 0.5;
data[1].value = Math.random() >= 0.5;
// set results state to data
this.setState({ results: data });
// condition if user value is false & previous result for user was not false
if (data.some(d => (d.value === false) && (this.previousResults[d.id] !== false))) {
var audio = new Audio(Sound);
// play a sound
audio.play();
}
data.forEach((item) => {
this.previousResults[item.id] = item.value;
});
}
第一种情况-John有一个真值,但您的要求是使用上面的代码,如果每个人的值为假,则每次都会播放声音你能解释一下吗?阿西尼先生,是的,彼得有一个真值,约翰有一个假值,它会每5秒自动生成随机的真值或假值。所以对于第一次渲染的声音,只播放John false值。对不起,Asiniy先生,我的代码数据和我期望的结果数据看起来不一样。我已经更新了我的问题。非常感谢你的回答,你能告诉我如何使用我的代码吗?非常感谢你,Jdgower先生,我试过了,而且很有效。非常感谢你的回答,但是我不知道如何将上面的代码与演示代码结合起来。@Ras你看到我答案的最后一行了吗?@Jamec我没有注意到你的最后一行,对此我很抱歉。我试图看到你的链接上面,但似乎它是不同的,我想播放一个声音,如果值是假的,在你的链接上,它的声音播放在真正的价值。当我看的时候,如果彼得的值从真变为假,约翰的值从假变为真,似乎一点声音都没有。我的意思是,我想播放一个声音,每个人的数据都从true变为false。@Ras如果你不能否定布尔值,你就不可能写出这段代码@我很抱歉让你生气。使用上面的链接,我看不到您更新的代码。你能出示密码吗?
state = {
results: []
}
const previousResults = {};
componentDidMount() {
this.getData()
// get data every 5 sec
setInterval(this.getData, 5000);
}
getData = () => {
// generate random value
data[0].value = Math.random() >= 0.5;
data[1].value = Math.random() >= 0.5;
// set results state to data
this.setState({ results: data });
// condition if user value is false & previous result for user was not false
if (data.some(d => (d.value === false) && (this.previousResults[d.id] !== false))) {
var audio = new Audio(Sound);
// play a sound
audio.play();
}
data.forEach((item) => {
this.previousResults[item.id] = item.value;
});
}