Потреблять события в правильном порядке
Я использую канал Пушера в приложении Laravel. Поэтому, когда я запустил событие от моего контроллера, оно было получено моим клиентом, и с помощью функции "толкатель" я добавляю некоторый текст с этим файлом 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 ответ
Решение
Вам нужно будет настроить какую-то очередь, чтобы они не сработали, пока не будет завершена предыдущая. Этот код не проверен, но должен выполнить свою задачу:
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());
}
}