旋转文本生成器

c_k*_*ick 8 javascript arrays jquery

我正在构建一个循环文本生成器.生成器将来自多个数组的句子(文本)组合在一起,通过视觉"循环"并附加它们.我认为最好用我现在构建它的基本版本的生成器创建一个小提琴:

说明

基本工作如下:

  1. 句子在单独的阵列中定义(Array1,Array2并且Array3在小提琴)
  2. 定义了第二组数组,包含可以组合的数组(combo0并且combo1在小提琴中)
  3. 在按下"生成"按钮时,将Generate调用该函数,该函数可视化地循环句子中的句子(combo0[0]在小提琴中)
  4. 这个函数循环自己直到句子循环8次(var times = 8在小提琴中)
  5. 完成后,该函数调用提供的回调函数.在这个回调中,它Generate再次运行,这次使用第二个数组(combo0[1]在小提琴中)

回调的原因是我需要"等待"循环效果完成,然后再继续.

问题

虽然这正是我所需要的(而且我非常怀疑这是否是这样做的方法;我在写一个循环自身的函数时总觉得有点奇怪),我有以下问题:

combo数组中,我定义哪个'句子'数组可以是可能的组合.如果有两种组合,这可以正常工作,但有两个以上,我有一个问题:

Generate(combo0[0], i, function(i) { //generate from first array element of combo0, callback to generating from second array of combo0
    Generate(combo0[1], i, function(i) {
        $('div#status').html('Done!'); //show status
        $('input#generate').removeAttr("disabled"); //enable button
    });
})
Run Code Online (Sandbox Code Playgroud)

我必须递归地重写它以适应combo由3个甚至4个选项组成的数组的可能性.如果一个combo数组只包含2个(或1个)数组,这可能会破坏脚本.

这就是我被困住的地方.主要问题是,如果我循环遍历combo数组,例如使用.each();,generate则会同步多次调用该函数,因此整个"循环"效果将丢失.

我已经尝试编写各种循环,考虑到给定combo数组的数组长度,但我今天比以往更多的浏览器崩溃,我无法弄清楚该怎么做.

c_k*_*ick 0

我已经设法修复它。离开屏幕一段时间是件好事。

我所做的是添加一个“n”计数器,如果达到变量的倍数times,该计数器就会增加,导致函数继续迭代,但从下一个数组(参见倒数第三行)输出lists[n]。最后,检查剩余的数组数量将确定我们是否完成。如果完成,最后一次写下该句子,运行可选的回调并返回 false。这样,该函数将接受整个数组,而不仅仅是子数组(combo与 相反combo[0]):

//Generate from array 'lists', simulating a 'slot machine
function Generate(lists, n, i, callbackFnk) {
    if (!(i >= 0)) { i= 0; }
    setTimeout((function(msg){
        i++;
        return function(){
            if (i % times != 0){
                //We haven't reached a multiple of the times variable yet, keep going.
                Generate(lists, n, i, callbackFnk);
            } else if (i % times === 0 && i != 0 && n < (lists.length-1)) {
                //Multiple reached, increase n
                n++;
                Generate(lists, n, i, callbackFnk);
            } else if (n == (lists.length-1)) {
                //we are done as there are no more arrays to go over
                showMessage(msg, i);
                if (callbackFnk) callbackFnk.call(this, i);
                return false;
            }
            showMessage(msg, i);
        }
    })(
        //output using the given n value
        lists[n][Math.floor(Math.random() * lists[n].length)]
    ), speed);
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处的工作小提琴:http ://jsfiddle.net/c_kick/kuNrA/1/

我希望这对其他人有帮助!