以正确的顺序使用事件

时间:2018-10-02 15:03:55

标签: javascript laravel events pusher pusher-js

我在Laravel应用程序中使用推送程序的通道。 因此,当我从控制器触发事件​​时,该事件就会被接收到我的客户端,并使用pusher函数在首页上添加一些带有lib https://github.com/albburtsev/jquery.typist的文本:

channel.bind('App\\Events\\TextAdded', function(data) {
            if(data.txt){
                printPhrase(data.txt);
                i++;
            }
        });
        function printPhrase(txt) {
            $('<span>')
                    .addClass('txt_' + i)
                    .appendTo('.typist_dialog')
                    .typist({
                        text:txt,
                        speed: 15,

                    }).on('end_type.typist', function() {
console.log('end')    ;
            }).typistStop() ;
        }

    });

如您所见,我可以捕获事件“ end_type”(当函数停止编写时)。

问题是我无法-或我不知道如何将“ channel.bind”放入队列中,因此等到printPhrase(txt)完成...这样就不会显示多个打印了在屏幕上停留时间...

1 个答案:

答案 0 :(得分:1)

您必须设置某种队列,以确保它们不会在上一个队列完成之前触发。这段代码未经测试,但可以解决问题:

var printQueue = [];
var queueWorking = false;

channel.bind('App\\Events\\TextAdded', function(data) {
    if(data.txt){
        printQueue.push(data.txt);
        workQueue();
    }
});

function printPhrase(txt) {
    i++;
    $('<span>')
        .addClass('txt_' + i)
        .appendTo('.typist_dialog')
        .typist({
            text:txt,
            speed: 15,
        }).on('end_type.typist', function() {
            queueWorking = false;
            workQueue();
        }).typistStop() ;
    }

function workQueue(){
    if(printQueue.length && !queueWorking){
        queueWorking = true;
        printPhrase(printQueue.shift());
    }
}