1

我有一个用 javascript 编写的应用程序。为了工作,我需要下载一堆文件。由于我可以拥有很多可能很长的文件,因此我将下载设为异步:

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);
}

我的问题是:下载确实有回调,但是由于可以有 5 个 smil 和 30 个视频,我怎样才能确保在调用 download_all 的回调之前完成所有下载?

我想在每次完整下载后(在回调中)增加一个变量,比如

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

就像我在 C 中所做的那样,但我找不到睡眠函数,而且它似乎与 js/node.js 的严格语法相反。

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

我确实看过How to execute a Javascript function only after multiple other functions have done? ,因为问题是完全一样的(funcA(),funcB(),当一切都完成后,funcC()),但在我的情况下,funcA()和funcB()可以在我需要之前启动十到二十次执行 funcC()。

我正在尝试修改另一个问题的答案代码来做我需要的事情,但是有人知道更简单的方法吗?

4

2 回答 2

1

试试这个代码。

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;
    }
 }
于 2013-07-31T10:09:36.090 回答
1

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

于 2013-07-31T08:47:17.230 回答