如何在每个设备上同时每隔30秒调用一次功能?

时间:2015-12-26 22:35:30

标签: javascript jquery

我会尝试正确解释我的问题。我想每30秒生成一次数字,如下所示:

function getRandomNumber(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
setTimeout(function(){
        getRandomNumber(0,14);
    }, 30000);

这很好,但在每个设备上都不一样,比如我用这个代码打开页面,我会得到随机数,但是如果我的朋友打开它,例如自打开页面5秒后,出现延迟。有什么办法可以解决吗?我认为像获取时间服务器并根据他这样做可以工作,但我不知道该怎么做。

3 个答案:

答案 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()

的那个instad

答案 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,因此它会重复。