我怀疑问题不是范围之一(您的范围没有问题),而是同步。searchYTVideos
两者都接受回调的事实searchVideo
向我表明他们是asynchronous
; 也就是说,它们会在 JavaScript 引擎有时间时完成它们的工作,然后调用回调。如果您可以分配虚构的“步骤编号”,它可能看起来像这样:
1 var videoData=[];
2 searchYTVideos("test1",0,function(vidYT){
//concat to videoData
15 videoData = videoData.concat(vidYT);
});
3 searchVideo("test2",0,function(vidDM){
//concat to videoData
23 videoData = videoData.concat(vidDM);
});
4 console.log(videoData);
// other stuff happens for a while...
请注意,在这个虚构的例子中,我先searchYTVideos
完成,但没有什么说它不可能是另一种方式:searchVideo
先完成,然后searchYTVideos
完成。
为了解决这个问题,你可以像其他人建议的那样链接函数,或者你可以使用 Promise:
<!-- "Q" promises library -->
<script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/1.0.0/q.js"></script>
<script>
var videoData=[];
var deferred1 = Q.defer();
searchYTVideos("test1",0,function(vidYT){
//concat to videoData
videoData = videoData.concat(vidYT);
deferred1.resolve();
});
var deferred2 = Q.defer();
searchVideo("test2",0,function(vidDM){
//concat to videoData
videoData = videoData.concat(vidDM);
deferred2.resolve();
});
Q.all([deferred1.promise, deferred2.promise]).then(function(){
console.log(videoData);
});
</script>