我必须加载两个api。 YouTube api在加载时调用onYouTubePlayerReady
,在加载时调用soundManager.onready(...)
的另一个api API。我在这些ready
函数中做了很多工作来准备网站。但是,我还需要知道两者何时完成,因此我可以进行更多初始化,这需要两者都完全加载。知道如何调用这两个ready
函数时调用的函数吗?
答案 0 :(得分:2)
对它们使用回调。
var callback = (function(){
var count = 0;
return function(){
count++;
if(count === 2){
//both ran and do something
}
}
})();
然后在两个onloads的最后只做:
callback();
if语句中的内容只会在第二次运行此函数时运行。
答案 1 :(得分:1)
只需设置几个标志:
var aDone = false;
var bDone = false;
function whenADone(){
// do your other stuff
aDone = true;
if(bDone) whenBothDone();
}
function whenBDone(){
// do your other stuff
bDone = true;
if(aDone) whenBothDone();
}
答案 2 :(得分:1)
Deferred可能有更好的方法,但这很简单,应该可行。只需跟踪已加载的内容和未加载的内容。
var status = {
youtube: false,
sound: false
};
var loaded = function() {
if (!status.youtube) return;
if (!status.sound) return;
// load stuff!
};
var onYoutubePlayerReady = function() {
status.youtube = true;
loaded();
};
soundManager.onready = function() {
status.sound = true;
loaded();
}
答案 3 :(得分:1)
使用jQuery deferred,您可以为每个就绪函数构建promise,并将它们与jQuery.when组合以触发最终操作。例如
function promiseYoutube() {
var dfd = $.Deferred();
window.onYoutubePlayerReady = function() {
console.log("Youtube");
dfd.resolve();
};
return dfd.promise();
}
function promiseSoundManager() {
var dfd = $.Deferred();
window.soundManager.onready = function() {
console.log("SoundManager");
dfd.resolve();
};
return dfd.promise();
}
$.when( promiseYoutube(), promiseSoundManager() ).then(function(){
console.log('Youtube+SoundManager');
});
模拟这些回调的小提琴http://jsfiddle.net/nikoshr/hCznB/
答案 4 :(得分:0)
您可以让readys
将布尔值设置为true然后针对$(document).ready(function () { if (youTube === true && soundManager === true) { // Do stuff }});
答案 5 :(得分:0)
如果使用jQuery,请查看deferred:
http://www.erichynds.com/jquery/using-deferreds-in-jquery/
http://api.jquery.com/category/deferred-object/
由于