我会尝试正确解释我的问题。我想每30秒生成一次数字,如下所示:
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
setTimeout(function(){
getRandomNumber(0,14);
}, 30000);
这很好,但在每个设备上都不一样,比如我用这个代码打开页面,我会得到随机数,但是如果我的朋友打开它,例如自打开页面5秒后,出现延迟。有什么办法可以解决吗?我认为像获取时间服务器并根据他这样做可以工作,但我不知道该怎么做。
答案 0 :(得分:1)
这个问题没有完美的解决方案,这里有两个选择:
一个简单的和一个复杂的应该更精确。
如果您在所有设备上都有相同的时间 *,您可以使用new Date().getTime() % 30000
进行第一次通话,因此它们全部同步,然后在超时时始终使用常量30000。
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
setTimeout(function() {
getRandomNumber(0, 14);
}, new Date().getTime() % 30000); // first time use this
*时区无关紧要,但只需一分钟
另一种方法是让服务器通过他的时间,然后猜测延迟以纠正加载时间,并使用new Date().getTime()
答案 1 :(得分:0)
最简单的解决方案之一是创建一个新的Date
对象,用getSeconds
读取秒数,然后以30的倍数对其进行舍入,并使用{调度生成器到下一步{1}}。一旦启动,您可以决定使用相同的功能再次安排它,或者设置setTimeout
的间隔。
如果您不想依赖本地时钟,我猜您必须使用 ntp 之类的服务,但它需要您知道要应用的增量值是什么到了时间等等。
答案 2 :(得分:0)
您可以使用一行PHP来完成此操作。
这可以在这里工作。
var path = require('path');
var webpack = require('webpack')
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
entry: {
demo: ['./demo/index.ts', 'webpack-dev-server/client?http://localhost:3000'],
lib: ['./src/js/index.js']
},
output: {
path: './build/',
publicPath: '/',
filename: '[name].js'
},
debug: true,
devtool: 'source-map',
resolve: {
extensions: ['', '.ts', '.js']
},
module: {
loaders: [
{ test: /\.tsx?$/, loader: 'ts' },
{ test: /\.coffee$/, loader: 'coffee' },
{ test: /\.(png|jpg)$/, loader: 'url' },
{ test: /\.jsx?$/, loader: 'babel', query: { presets: ['es2015'] }, exclude: /node_modules/, },
{ test: /\.scss$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap!sass?sourceMap') },
{ test: /\.css$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap') },
{ test: /\.(ttf|eot|svg|woff(2)?)(\?[\s\S]+)?$/, loader: 'url' }
]
},
devServer: {
contentBase: './demo'
},
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery'
}),
new ExtractTextPlugin("[name].css", { allChunks: true })
]
};
请注意,我使用setInterval而不是setTimeout,因此它会重复。