2016-12-07 4 views
1

Я использую функцию doPlaySequence, чтобы воспроизвести несколько видеороликов, а затем показать картинку с функцией drawConfig. Я написал код, как это:jQuery обещание: функция обратного вызова, вызванная сразу

function wait(dtd) { 
 
    var dtd = $.Deferred(); 
 
    
 
    setTimeout(function() { 
 
    doPlaySequence(); 
 
    dtd.resolve(); 
 
    }, 0); 
 
    
 
    return dtd.promise(); 
 
} 
 

 
wait().then(drawConfig);

Однако drawConfig вызывается сразу, пока видео не заканчиваются. Я просто скопировал пример просто так, чтобы код выглядел уродливым. Я использую video.js для воспроизведения видео.

var stropsrc = new Array(3); 
 
stropsrc[0]= "../rs/MOVIE/KlogoPk.mp4"; 
 
stropsrc[1]="../rs/MOVIE/theme.mp4"; 
 
stropsrc[2]= "../rs/MOVIE/OpPk.mp4"; 
 

 
function doPlaySequence() 
 
{ 
 
    var divcontainer = document.createElement("div"); 
 
    divcontainer.setAttribute("id","divop"); 
 
    document.body.appendChild(divcontainer); 
 

 
    var playID = "op0"; 
 

 
    var opplay = document.createElement('video'); 
 
    opplay.setAttribute("id",playID); 
 
    opplay.preload = "none"; 
 

 

 
    divcontainer.appendChild(opplay); 
 

 
    opplay.src = stropsrc[0]; 
 

 

 
    var AttrObj = {"datacount":0}; 
 
    var myPlayer; 
 
    videojs.setAttributes(opplay,AttrObj); 
 

 

 
    myPlayer = videojs(opplay); 
 
    myPlayer.play(); 
 

 

 
    opplay.addEventListener("ended",function(e) 
 
    { 
 
    e.preventDefault(); 
 

 
    var c = parseInt(this.getAttribute("datacount"))+1; 
 
    if(c < 3) 
 
    { 
 
     opplay.src = stropsrc[c]; 
 
     AttrObj.datacount = c; 
 
     videojs.setAttributes(opplay,AttrObj); 
 

 
     myPlayer = videojs(opplay); 
 
     myPlayer.play(); 
 

 
    } 
 
    else//end 
 
    { 
 

 
     /*reset*/ 
 
     opplay.src = stropsrc[0]; 
 
     AttrObj.datacount = 0; 
 
     videojs.setAttributes(opplay,AttrObj); 
 

 

 
     /*hide*/ 
 
     var divContainer = document.getElementById("divop"); 
 

 
     divContainer.style.display = "none"; 
 
     divContainer.style.visibility = "hidden"; 
 

 
     var divOP = document.getElementById("op0"); 
 
     divOP.style.display = "none"; 
 
     divOP.style.visibility = "hidden"; 
 
    } 
 
    });

+0

Это ожидаемое поведение - вы установите тайм-аут на '0', поэтому он выполняется немедленно. Что вы ожидаете? –

+0

@RoryMcCrossan Я хочу, чтобы drawConfig вызывается после завершения doPlaySequence (воспроизведение видео заканчивается), но оно вызывается сразу. –

+1

Не могли бы вы добавить код 'doPlaySequence()' на ваш вопрос. –

ответ

1

Чтобы только запустить drawConfig функцию после видео завершает вам необходимо либо вызвать его внутри ended обработчика событий видео, или создать обещание, которое решает в этом случае. Попробуйте это:

function doPlaySequence() 
{ 
    var deferred = $.Deferred(); 

    // your code... 

    var opplay = document.createElement('video'); 
    // opplay logic here... 

    opplay.addEventListener("ended", function(e) { 
    // video ended logic here... 

    deferred.resolve(); 
    } 

    return deferred; 
} 

doPlaySequence().then(drawConfig); 

Вы увидите, что функция doPlaySequence теперь возвращает отсроченной, которая только решена после того, как видео перестал играть. В свою очередь, будет вызываться drawConfig.

+0

Спасибо, позвольте мне попробовать. –

+0

Да, работает, еще раз спасибо! –

1

У проигрывателя video.js есть событие, в котором вы должны прослушать, и вы должны разрешить сообщение об объекте объекта Deferer.

В вашем doPlaySequence() делать,

myPlayer.on('ended', function() { 
    dtd.resolve(); 
}); 

Вам может понадобиться передать свой объект Dtd к doPlaySequence, или просто создать его внутри doPlaySequence, так как это единственная цель подождать, пока видео не играет полностью.

Установка таймаута не будет служить вашей цели.

+0

Спасибо, позвольте мне попробовать. –

+0

Да, я получил его. Я должен разрешить его на всех концах видео, в ветке «else». Я узнаю, что код выполняется в последовательности, кроме видео и рис. –

+0

Чтобы сделать код кратким, я должен использовать закрытие вместо того, чтобы записывать весь видеокод в функцию ожидания? –

Смежные вопросы