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

如何在node.js中为promises运行for循环

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

    我有一个返回承诺的函数。promise实际上读取一个JSON文件,并将该文件的一些数据推送到一个数组中,然后返回该数组。我可以用一个文件来完成,但我想用多个文件路径运行for循环,并希望将每个承诺的所有结果(解析)推送到一个数组中。正确的方法是什么?

    let secondMethod = function(directoryName) {
        let promise = new Promise(function(resolve, reject) {
            let tJsonPath = path.join(directoryPath, directoryName[0], 't.json')
            jsonfile.readFile(tJsonPath, function(err, obj) {
                let infoRow = []
                infoRow.push(obj.name, obj.description, obj.license);
                resolve(infoRow)
            })
        }
        );
        return promise;
    }
    

    如何在directoryName数组上运行循环,以便对数组的每个元素执行jsonfile.readFile,并将其结果存储在全局数组中?

    1 回复  |  直到 6 年前
        1
  •  4
  •   CertainPerformance    6 年前

    你需要使用 Promise.all 将每个名称映射到 Promise . 还要确保检查 reject

    const secondMethod = function(directoryName) {
      return Promise.all(
        directoryName.map((oneName) => new Promise((resolve, reject) => {
          const tJsonPath = path.join(directoryPath, oneName, 't.json')
          jsonfile.readFile(tJsonPath, function(err, obj) {
            if (err) return reject(err);
            const { name, description, license } = obj;
            resolve({ name, description, license });
          })
        }))
      );
    };
    
    // Invoke with:
    secondMethod(arrOfNames)
      .then((results) => {
        /* results will be in the form of
        [
          { name: ..., description: ..., license: ... },
          { name: ..., description: ..., license: ... },
          ...
        ]
        */
      })
      .catch((err) => {
        // handle errors
      });