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

How to execute a undefined number of funcA() and funcB() before starting funcC()?

本文关键字:funcB funcA 未定义 启动 funcC 执行      更新时间:2023-09-26

我有一个用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的正确语法相反。

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

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

我正试图修改另一个问题的答案代码以满足我的需要,但有人知道更简单的方法吗?

看看Async Github库。它既可以在node 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;
    }
 }