NodeJs与for循环下载使用异步

时间:2017-07-25 09:53:36

标签: javascript node.js loops async.js

我有这个循环下载一些文件,它工作正常。

但文件的下载方式与“2,3,4,1,5”相同,而不是“1,2,3,4,5”。

我知道怎么做。每个异步和瀑布异步,但我不知道如何做这个循环。

Config.TotalFiles = 5;

for(i = 1; i <= Config.TotalFiles; i++) {
   $this.CreateJSONFile(i, function() {
     cls();
   });
}

当下载完成后我想调用我的回调,我试过这个if(id == Config.TotalFiles)但它不起作用,因为id不好。

如何使用此循环完成“异步”过程?

由于

3 个答案:

答案 0 :(得分:1)

您可以使用async.whilst:

Config.TotalFiles = 5;
var count = 1;

//pass your maincallback that you want to call after downloading of all files is complete.

var callMe = function(mainCallback){
    async.whilst(
        function() { return count <= Config.TotalFiles; },
        function(callback){
            $this.CreateJSONFile(count, function() {
                cls();
                count++;
                callback();
            });
        }, function(){
           //This function is the final callback
           mainCallback();
        })
}

答案 1 :(得分:0)

是的,您需要实现异步for-loop。当前步骤已完成时,主要思想是调用回调(如continue)。您可以使用上面提到的一些有用的库(async.js)。但你也必须明白它不会并行完成(所以完成下载的时间会增加)。

这些是一些很好的示例可以帮助您:https://github.com/caolan/async/blob/v1.5.2/README.md#whilst

答案 2 :(得分:0)

请查看我的屏幕以了解我的情况。

http://imgur.com/a/lxQyy

或者这个pastebin https://pastebin.com/jtANeSxq

                cls();
                for(i = 1; i <= Config.TotalFolders; i++) {
                    $this.CreateJSONFile(i, function() {
                        setTimeout(function() {
                            cls();
                        }, 200);
                    });
                }

    CreateJSONFile(id, callback) {
    console.log(chalk.hex("#607D8B")(`Creating JSON Files... [${id}/${Config.TotalFolders}]`));
    var requestOptions = {
        encoding: "binary",
        method: "GET",
        uri: `${Config.Url.Source}${Config.Url.Audio}` + `${id}/skeud.json`
    };
    request(requestOptions, function (error, response, body) {
        if (!error && response.statusCode === 200) {
            if(!fs.existsSync(Config.DownloadsPath + `${id}/skeud.json`)) {
                fs.writeFile(Config.DownloadsPath + `${id}/skeud.json`, body, function(err) {
                    if(err) {
                        return console.log(err);
                    }
                    console.log(chalk.hex("#FFEB3B")(`JSON File ${chalk.inverse(id)} ${chalk.hex("#FFEB3B")("created")}`));
                });
            } else {
                console.log(chalk.hex("#FFEB3B")(`JSON File ${chalk.inverse(id)} ${chalk.hex("#FFEB3B")("skipped")}`));
            }
        }
    });
    /*if(created == Config.TotalFolders) {
        callback();
    }*/
}

由于