如何在启动funcC()之前执行未定义数目的funcA()和funcB()?

我有一个应用程序在JavaScript中编写。 为了工作,我需要下载一堆文件。 由于我可以有很多文件可以很长,我做了下载asynchronous:

function download_all(xml, callback){ var i=0; while(i<xml.smil.length) { download(xml.smil[i]); i=i+1; } i=0; while(i<xml.video.length) { download(xml.video[i]); i=i+1; } callback(xml); } 

我的问题是:下载有一个callback,但因为可以有5个s​​mil和30个video,我怎么能确保所有的下载将在download_all的callback被调用之前?

我每次完成下载(在callback)之后递增一个variables,等等

 while(smildlcompleted<xml.smil.length && videodlcompleted<xml.video.length) { sleep(1000); } 

就像我在C中所做的一样,但是我找不到睡眠函数,它似乎与js / node.js的粗体语法相反。

有没有办法在callback之前等待所有下载完成?

我看过如何在多个其他函数完成后才执行Javascript函数? ,因为问题是相当相同的(funcA(),funcB(),当所有完成funcC()),但在我的情况下,funcA()和funcB()可以启动十到二十次之前,我需要做funcC()。

我试图修改其他问题的答案代码做我所需要的,但有人知道任何更简单的方法?

看看Async Github库。 它可以在节点js和浏览器中使用。 您可能需要async.parallelasync.series

试试这个代码。

 function download_all(xml, callback){ var i=0 , no_of_downloads , downloadsCompleted; no_of_downloads = xml.smil.length + xml.video.length; downloadsCompleted = 0; function afterDownload(){ downloadsCompleted + =1; if(downloadsCompleted ===no_of_downloads ) { // all downloads are completed callback(); //call the callback here } } while(i<xml.smil.length) { download(xml.smil[i],afterDownload); i=i+1; } i=0; while(i<xml.video.length) { download(xml.video[i],afterDownload); i=i+1; } }