【问题标题】:Can't populate array and return无法填充数组并返回
【发布时间】:2020-10-22 23:20:57
【问题描述】:

我正在尝试读取特定文件夹中的所有文件。

但我在返回包含所有这些文件数据的数组时遇到了一些问题。

我的函数返回一个空数组,因为在所有值都被推入数组之前调用了 return。

如何使用异步机制解决此问题?

app.get('/load-schemas', async function (req, res) {
  var schemas = [];
  fs.readdirSync('Schemas').forEach(file => {

    fs.readFile('Schemas/' + file, "utf8", function(err, data) {
      schemas.push(data);
    })
  });
  
  res.status(200).send(schemas);
})

【问题讨论】:

    标签: javascript node.js asynchronous async-await


    【解决方案1】:

    我想最简单的解决方案是使用readFileSync

    let data = fs.readFileSync('Schemas/' + file, "utf8");
    schemas.push(data);
    

    【讨论】:

      【解决方案2】:

      由于您可以在代码中使用 async/await,我将使用 fs 的承诺并像这里一样等待它们 https://stackoverflow.com/a/58332163/732846

      这样代码看起来像“同步”代码,但有异步的好处

      const { promises: fs } = require("fs");
      
      app.get('/load-schemas', async function (req, res) {
        var schemas = [];
        const dirs = await fs.readdir('Schemas');
        dirs.forEach(file => {
          const data = await fs.readFile('Schemas/' + file, "utf8");
          schemas.push(data);
        });
      
        res.status(200).send(schemas);
      })
      

      【讨论】:

        【解决方案3】:

        我认为你可以兑现承诺。

        sn-p 来自:How do I wait for multiple fs.readFile calls?

        const fs = require('fs');
        
        function readFromFile(file) {
            return new Promise((resolve, reject) => {
                fs.readFile(file, function (err, data) {
                    if (err) {
                        console.log(err);
                        reject(err);
                    }
                    else {
                        resolve(JSON.parse(data));
                    }
                });
            });
        }
        
        const promises = [
            readFromFile('./output/result3.json'),
            readFromFile('./output/result4.json')
        ];
        
        Promise.all(promises).then(result => {
            console.log(result);
            baseListOfFiles = result[0];
            currentListOfFiles = result[1];
            // do more stuff
        });
        

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#:~:text=The%20Promise.,input%20iterable%20contains%20no%20promises.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-04
          • 2016-04-28
          • 2019-07-17
          • 1970-01-01
          • 1970-01-01
          • 2020-11-24
          相关资源
          最近更新 更多