簡體   English   中英

使用兩個 for 循環嵌套 Javascript 的承諾

[英]Promise with two for loops nested Javascript

我想用 promise 創建一個異步方法,但我不明白為什么它不能與我的程序一起使用:

app.get('/historique', function (req, res) {

  const pathFolders = `.\\..\\website\\src\\assets\\covering\\`;

  const promise2 = new Promise(function (resolve, reject) {

    fs.readdirSync(pathFolders).forEach(folder => {

      recursive(`${pathFolders}\\${folder}\\`, function (err, files) {

        var datapath = [];

        files.forEach(file => {

          console.log("1");

        });

        console.log("2");
      });

      console.log("3");
      resolve("3");
    });

  });

  promise2.then(function (value) {
    console.log("end")
    res.status(200).send("end")
  });

})

通常,我希望程序在 console.log 上按順序顯示 1 1 1 2 1 1 2 ... 然后是 3,最后是“結束”。 但是 console.log 先顯示 3 然后“end”然后是 1 1 1 2 1 1 2 ...

你能幫我嗎。 我認為這是因為 for 循環,但我無法解決這個問題。

正如 E. Zacarias 在他的評論中已經解釋的那樣, recursive-readdir實現是異步實現的。 但是它通過省略回調參數支持與Promise一起使用。

然后你可以從迭代器函數返回一個Promise並用Promise.all等待它。

這將使您的代碼更加簡單:

app.get('/historique', function (req, res) {

  const pathFolders = `.\\..\\website\\src\\assets\\covering\\`;

  const promise2 = Promise.all(
    // readdirSync returns an Array of folder name strings
    // Call Array.map to transform it into an array of Promise
    fs.readdirSync(pathFolders).map(folder => {
      // return a Promise for the folder from the map function
      return recursive(`${pathFolders}\\${folder}\\`).then(files => {
        var datapath = [];
        files.forEach(file => {
          console.log("1");
        });
        console.log("2");
      });
    });
  );

  promise2.then( value => {
    console.log("end")
    res.status(200).send("end")
  });

})

這里的重要方面是了解Array.prototype.mapPromise.all的工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM