【问题标题】:execute script based on variable states根据变量状态执行脚本
【发布时间】:2013-01-07 16:08:06
【问题描述】:

我正在创建一个视频播放器,它依赖于通过 ajax 加载 vimeo 和 youtube 播放列表 api。加载后,对于 youtube,我需要循环播放播放列表中的所有视频并调用每个视频的数据 api 以获取其修改日期。一旦加载了所有 vimeo 视频并加载了所有 youtube 视频并有了它们的创建日期,我需要使用 jquery 对它们进行排序。

我正在寻找检测这些过程何时完成的最佳方法,问题是在完成 vimeo 功能和 youtube 功能之前我无法真正开始排序。我能想到的最好的办法是运行一个 setInterval 函数来检查两个布尔标志的状态 - 例如:

var youtubeReady = false, vimeoReady = false;
var videoStatusInterval = setInterval("checkVideoStatus",1000);

function checkVideoStatus(){
  if (youtubeReady === true && vimeoReady === true){
    sortVideos();
  }
}

问题在于这只会定期运行(示例中的每一秒) - 一旦满足两个条件,似乎应该有一种方法可以立即执行此操作。有人有什么想法吗?

【问题讨论】:

  • 提示,不要在setInterval 中使用字符串。只需传递对函数setInterval(checkVideoStatus, 1000); 的引用,您还可以通过减少间隔时间使其更加“即时”。
  • 任何一个 API 都应该触发某种事件,让您知道它已准备好。在不了解您的代码的情况下,我会说检查您可以订阅的事件。然后为那些将触发您的排序功能的事件设置回调。

标签: javascript jquery ajax intervals youtube-javascript-api


【解决方案1】:

我不熟悉 Youtube 的 API 和 Vimeo,但也许他们有一个 'ready'、'done' 或 'loaded' 事件,你可以听两个,然后,在你设置的处理程序中,你设置两个标志, 因此,如果两者都为真,则执行如下操作:

    //Let's createa a couple of custome events to simulate the real ones, comming from Youtube and Vimeo.
var youtube = document.createEvent('Event'),
    vimeo  = document.createEvent('Event');

youtube.initEvent('youtubeReady');
vimeo.initEvent('vimeoReady');

/*
* This function will be use to run YOUR code, ONCE BOTH events are triggered.
* As said, functions are objects so, as any object in JS, you can add fields at any time you want.
* Check this page in Mozilla's Developer Network for more detail:  http://goo.gl/Pdvpk */
function sourcesReady(){
  if(sourcesReady.youtube && sourcesReady.vimeo){
        alert('Both sources ready!');
  }
  else if(sourcesReady.youtube){ 
    alert('Only Youtube ready!');
  }
  else if(sourcesReady.vimeo){ 
    alert('Only Vimeo ready!');
  }
}

//Let's set a couple of event handlers for the 'ready' events, these handlers will set the flags that we need.
document.addEventListener('youtubeReady', function youtubeReadyHandler(){
  sourcesReady.youtube = true; //We set/create the field in the function, that is, the function ITSELF has the field, not the 'this'.
  sourcesReady(); //We call it to evaluate the condition.
}, true);

document.addEventListener('vimeoReady', function vimeoReadyHandler(){
  sourcesReady.vimeo = true; //same as before.
  sourcesReady(); //We call it to evaluate the condition.
}, true);

document.dispatchEvent(youtube);
document.dispatchEvent(vimeo);

希望这个建议对您有所帮助。 =)

【讨论】:

  • 但是设置函数的属性会重新执行它吗?您还想在每个事件订阅中添加对 sourcesReady() 函数的显式调用。这将适应任何一个在另一个之前完成。
  • 是的——我也想问同样的问题。你不需要说 sourcesReady.vimeo = true; sourceReady();
  • 我忘了你加了,但是,在函数对象中设置变量后你会调用它,这样,条件就会被检查,如果它不满足,那就下一次。
  • 您能否修改您的答案,以便我了解 Hugo 的结构?我不确定我是否真的遵循,并且我不熟悉将函数用作对象
【解决方案2】:

即使这些操作是异步完成的,您仍然可以创建全局变量。

var youTubeScanDone = false, vimeoScanDone = false;

然后在完成后将这些变量设置为true。创建一个函数function sortVideoList() { ... },并在每次扫描结束时调用这样的一行

if (youTubeScanDone && viemoScanDone) sortVideoList();

只需确保在调用此行之前将布尔值设置为 true(取决于您所在的扫描功能。

【讨论】:

  • 嗯...他说他正在使用 setInterval。我是说忘记setInterval,只是有条件地从扫描例程的末尾调用排序例程。
  • 我明白你在说什么,做同样的事情,但在每个 API 调用结束时进行检查。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多