gpt4 book ai didi

javascript - Q promises 在 lodash reduce 函数中不起作用

转载 作者:行者123 更新时间:2023-11-30 12:43:14 25 4
gpt4 key购买 nike

我正在尝试返回具有最早修改日期的目录中的文件。这种方法似乎在 createFileDateMap 函数中失败了。我想减少一组文件路径并创建一个包含文件名和修改日期的对象。 getModDate 函数是一个异步的 fs.lstat 调用。我似乎无法将 reducer 的 acc 设置为 .then() block 中的值。当值取决于异步调用时,我不确定如何实现减少

var _ = require('lodash'),
fs = require('fs'),
path = require('path'),
Q = require('q');

function checkDir(dir) {
// Check if given path is valid directory
var deferred = Q.defer();
fs.lstat(dir, deferred.makeNodeResolver());
return deferred.promise.invoke('isDirectory');
}

function getFiles(dir) {
// Get all files within a directory
var deferred = Q.defer();
fs.readdir(dir, deferred.makeNodeResolver());
return deferred.promise;
}

function makeFullPathFileArr(dir, files) {
// Return array of full paths
return _.map(files, function(file) {
return path.join(dir, file);
});
}

function getModDate(file) {
// Return modification date of file
var deferred = Q.defer();
fs.stat(file, deferred.makeNodeResolver());
return deferred.promise.get('mtime');
}

function createFileDateMap(filesArr) {
// Return an obj of file paths and modification dates as Date objects
// {{ file1: Date, file2: Date }}
var fileDateMap = _.reduce(filesArr, function(acc, file) {
getModDate(file)
.then(function(modDate) {
acc[file] = moment(modDate);
});
return acc;
}, {});
return fileDateMap;
}

function getMinDateFile(mapObj) {
// return the file name which has the earliest modification date
var dates = _.transform(mapObj, function(result, date, key) {
result[key] = new Date(date);
});
var minDate = new Date(Math.min.apply(null, _.values(dates)));
var invertedMapObj = _.invert(mapObj);

return invertedMapObj[minDate];
}

var dir = '../reports';
checkDir(dir)
.then(function(exist) {
if(exist) {
getFiles(dir)
.then(function(fileNames) {
return makeFullPathFileArr(dir, fileNames);
})
.then(function(fullpathsArr) {
return createFileDateMap(fullpathsArr);
})
.then(function(fileAndDatesObj) {
console.log(getMinDateFile(fileAndDatesObj));
});
}
})
.catch(function(err) {
console.log(err);
});

最佳答案

感谢@BenjaminGruenbaum 的帮助。 :)

function createFileDateMap(filesArr) {
// Return an obj of file paths and modification dates as Date objects
// {{ file1: Date, file2: Date

return Q.all(_.map(filesArr, getModDate))
.then(function(modDates) {
return _.zipObject(filesArr, modDates);
});
}

关于javascript - Q promises 在 lodash reduce 函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23597319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com