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