jQuery promise:callback 函数立即调用

jQuery promise:callback function called at once

我使用函数 doPlaySequence 播放多个视频,然后使用函数 drawConfig 显示一张图片。我这样写代码:

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";
    }
  });

只有 运行 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 函数现在 returns 延迟,只有在视频停止播放后才会解决。反过来,drawConfig 将被调用。

video.js 播放器有一个您应该收听的已结束事件,您应该解析您的 Deferer 对象 post 那。

在你的 doPlaySequence() 中做,

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

您可能需要将您的 dtd 对象传递给 doPlaySequence,或者只是在 doPlaySequence 中创建它,因为它只是 objective 是等待视频完全播放。

设置超时不会达到您的目的。