jQuery承诺:立即调用回调函数

时间:2016-12-07 08:21:12

标签: jquery promise video.js

我使用函数 $(".menulist").on("click", function (e) { e.preventDefault(); var url = $(this).attr("href"); $.ajax({ url: url, dataType: 'html', cache: true, success: function (data) { $('#result').html(data); requestCache[url] = data; } }); }); 播放多个视频,然后显示功能为doPlaySequence的图片。我写了这样的代码:



drawConfig




但是,视频不会在视频结束时立即调用function wait(dtd) { var dtd = $.Deferred(); setTimeout(function() { doPlaySequence(); dtd.resolve(); }, 0); return dtd.promise(); } wait().then(drawConfig);。我只是简单地复制了这个例子,所以代码可能看起来很难看。我使用video.js来播放视频。



drawConfig




2 个答案:

答案 0 :(得分: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将被调用。

答案 1 :(得分:1)

video.js播放器有一个你应该听的结束事件,你应该解决你的Deferer对象帖子。

在你的doPlaySequence()中,

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

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

设置超时不符合您的目的。