Javascript 使用异步函数中的数据

Javascript 使用异步函数中的数据,javascript,node.js,Javascript,Node.js,我有一个关于异步函数以及如何在函数返回结果后发送内容的问题。这就是我努力实现的目标: 在处理节点中的GET请求时,我读取文件夹的内容,并返回该文件夹中的文件。接下来,我想循环该文件夹中每个文件的统计信息,只加载在特定时间段内创建的文件,最后将这些文件中的数据作为对请求的响应发送。它看起来像这样: array = [] fs.readdir(path, function(err, items) { items.forEach(function(item) { fs.sta

我有一个关于异步函数以及如何在函数返回结果后发送内容的问题。这就是我努力实现的目标:

在处理节点中的GET请求时,我读取文件夹的内容,并返回该文件夹中的文件。接下来,我想循环该文件夹中每个文件的统计信息,只加载在特定时间段内创建的文件,最后将这些文件中的数据作为对请求的响应发送。它看起来像这样:

array = []

fs.readdir(path, function(err, items) {
    items.forEach(function(item) {
        fs.stat(path, function(err, stats) {
            if (period check) {
                array.push(data)
            }
        })
    })
}

res.send(array)
这种方法最终会发送一个空数组,我已经研究了一些承诺,这些承诺似乎是解决方案,但我无法让它们在这种情况下工作。使用fs.statSync而不是fs.stat确实有效,但这会大大降低性能,而且感觉它应该是可以实现的,但我不知道如何实现

有没有人能解决这个问题



编辑:关于标记为重复的问题,我试图先用那里的答案解决我的问题,但没有成功。我的问题有一些嵌套函数和循环,并且比这里给出的示例更复杂

如果您喜欢基于
承诺的方法,请使用此选项:

var path = require('path')

fs.readdir(myPath, function(err, items) {
    var array = [];

    Promise.all(items.map(function(item) {
        return new Promise(function(resolve, reject) {
            fs.stat(path.resolve(myPath, item), function(err, stats) {
                if (err) {
                   return reject(err)
                }

                if (/* period check */) {
                  array.push(data)
                }

                resolve()
            })
        })
    })).then(function() {
        res.send(array)
    }).catch(function(error) {
        // error handling
        res.sendStatus(500)
    })
}

以下是我的建议

//这是一个新的API,您可能需要使用util.promisify
//如果您使用的是旧节点版本,请使用npm包。
const promisify=require('util')。promisify;
常数fs=要求('fs');
//promisify将基于回调的API转换为基于承诺的API。
const readdir=promisify(fs.readdir);
const stat=promisify(fs.stat);
const dataProm=readdir(路径)
。然后((项目)=>{
//将每个项目映射到其属性上的承诺。
const statProms=items.map(path=>fs.stat(path);
//等待所有这些承诺得到解决。
返回承诺。全部(statProms);
})
//根据结果删除不需要的文件统计信息
//定期检查。
然后(stats=>stats.filter(stat=>periodCheck(stat));
//dataProm将解析您的数据。您不妨将其返回
//原样。但如果需要使用“res.send”,可以执行以下操作:
dataProm.then((数据)=>{
res.send(数据);
},(错误)=>{
//如果你离开承诺链,你需要处理
//现在就犯错误,否则你会默默地吞下它们。
res.senderor(err);

})
看看异步库,eachSeries方法好的,我已经完成了更新。让我知道这对您是否有效。Hanks,这成功了!您使用path软件包有什么具体原因吗?我只是连接字符串以获得完整的路径。@Evertvdw它只是通用的,可以确保文件分隔符的跨平台兼容性y不总是向前斜杠。最好是用一个试抓来包围阵列“推若”,并相应地拒绝承诺。那里发生的任何不好的事情都会被吞没。@QuentinRoy它被吞没了: