2017-07-25 126 views
0

我有這個循環下載一些文件,它的工作正常。NodeJs使用異步與循環下載

但是這些文件是按照「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是不好的。

我該如何做這個循環的「異步」過程?

感謝

+0

'async.times'? – Bergi

+0

我總是有「1,5,3,4,2」...... – EyWN

+0

這取決於每個'CreatJSONFile'調用的工作速度有多快。他們*始終以預期的順序啓動*。如果你想確保它們也按照預期的順序結束,你唯一的選擇是順序執行而不是並行執行(使用'... Series'方法)。 – Bergi

回答

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(); 
     }) 
} 
+0

對不起,但我只想要一個號碼(81)^^ – EyWN

+0

您可以查看我編輯的答案。它會完成這項工作。 – Kamesh

+0

這是工作,謝謝:) – EyWN

0

是的,你需要實現環異步。主要思想是在當前步驟完成後調用回調(如繼續)。您可以使用上面提到的一些有用的庫(async.js)。但你也必須明白,它不會並行完成(所以完成下載的時間將會增加)。

這些都是一些很好的例子,以幫助您:https://github.com/caolan/async/blob/v1.5.2/README.md#whilst

+0

我總是「1,5,3,4,2」... – EyWN

+0

你能檢查我的答案嗎?我添加了更多的代碼 – EyWN

0

檢查我的屏幕爲請理解我的情況。

http://imgur.com/a/lxQyy

還是這個引擎收錄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(); 
    }*/ 
} 

感謝