代码之家  ›  专栏  ›  技术社区  ›  Un1

无法在循环中添加函数的结果

  •  0
  • Un1  · 技术社区  · 6 年前

    我有这个功能 getSize() (来自npm模块: get-folder-size )计算文件夹(目录)中所有文件的总大小。

    const getSize = require('get-folder-size')
    
    let folders = ["C:\\test folder", "C:\\test folder 2\\sub folder"]
    
    funciton totalFilesizeOfAllFolders () {
      let totalSizeOfAllFolders = 0
      this.folders.forEach(folder => {
        getSize(folder, (err, size) => {
          if (err) { throw err }
          // ADD UP THE "SIZE" TO THE TOTAL SOMEHOW
          // Just doing the following returns 0: totalSizeOfAllFolders += size
        })
      })
      return totalSizeOfAllFolders 
    }
    

    问题

    如何在数组中循环 folders 把计算出来的 size 数组中所有文件夹的名称?我不知道该怎么归还那本书 功能外

    2 回复  |  直到 6 年前
        1
  •  2
  •   Luca Kiebel    6 年前

    你可以用答应我。好的在这里,首先构建一个承诺数组,然后等待所有承诺计算总大小:

    //const getSize = require('get-folder-size')
    
    let folders = ["C:\\test folder", "C:\\test folder 2\\sub folder"];
    
    
    function totalFilesizeOfAllFolders(callback) {
      let folderPromises = folders.map(folder => { // use map to create a new array of promises
        return new Promise((resolve, reject) => getSize(folder, (err, size) => {
          if (err) {reject(err)}
          resolve(size);
        }));
      })
      Promise.all(folderPromises) // promise.all waits for all promises in the array to resolve
        .then(sizes => callback(sizes.reduce((a, b) => a + b, 0))); // reduce the array of sizes to a size
    }
    
    
    totalFilesizeOfAllFolders(s => console.log(s)); // => 127
    
    
    
    // getsize stub. remove me once you have access to the npm package
    function getSize(name, callback) {let sizes = {"C:\\test folder":112, "C:\\test folder 2\\sub folder":15}; callback(null,sizes[name])}
        2
  •  1
  •   Remi    6 年前

    Async 帮助您异步迭代调用,然后将回调传递给函数以返回 totalSizeOfAllFolders .

    function totalFilesizeOfAllFolders (done) {
      let totalSizeOfAllFolders = 0;
      async.each(folders, (folder, callback) => {
        getSize(folder, (err, size) => {
          if (err) { throw err }
          totalSizeOfAllFolders++;
          callback();
        });
      }, (err) => {
        done(totalSizeOfAllFolders);
      });
    }