基于异步方法对Ionic Native读取的文件数组按修改日期排序
按修改日期排序Ionic Native文件Entry数组的解决方案
没问题,我来帮你搞定这个需求!因为Entry.getMetadata()是基于回调的方法,我们需要先把它转换成Promise风格的异步操作,等所有文件的修改日期都获取到后再进行排序。下面是具体的实现步骤和代码示例:
1. 封装getMetadata为Promise
首先我们把回调式的getMetadata包装成Promise,这样就能用async/await或者Promise.all来批量处理所有Entry:
import { Entry, Metadata } from '@ionic-native/file/ngx'; /** * 为单个Entry获取元数据,并返回包含Entry和修改日期的Promise */ function getEntryWithMetadata(entry: Entry): Promise<{ entry: Entry, modificationDate: Date }> { return new Promise((resolve, reject) => { entry.getMetadata( (metadata: Metadata) => { // 将metadata中的modificationDate转换为Date对象,方便后续排序比较 resolve({ entry, modificationDate: new Date(metadata.modificationDate) }); }, (error) => { console.error(`获取${entry.name}的元数据失败:`, error); reject(error); } ); }); }
2. 批量处理并排序Entry数组
接下来我们编写排序函数,先批量获取所有Entry的元数据,再按修改日期排序:
方案一:严格模式(单个失败则整体抛出错误)
如果要求必须所有文件都能获取到元数据才进行排序,可以用这个版本:
/** * 将Entry数组按修改日期排序(默认降序,最新的在前) * @param entries 读取到的Entry数组 * @param isAscending 是否升序排列,默认false(降序) */ async function sortEntriesByModificationDate(entries: Entry[], isAscending = false): Promise<Entry[]> { try { // 等待所有Entry的元数据都获取完成 const entriesWithDates = await Promise.all(entries.map(entry => getEntryWithMetadata(entry))); // 按修改日期排序 entriesWithDates.sort((a, b) => { const dateA = a.modificationDate.getTime(); const dateB = b.modificationDate.getTime(); // 升序则dateA - dateB,降序则dateB - dateA return isAscending ? dateA - dateB : dateB - dateA; }); // 提取排序后的Entry数组返回 return entriesWithDates.map(item => item.entry); } catch (error) { console.error('排序过程出错:', error); throw error; // 抛出错误让调用方处理 } }
方案二:容错模式(忽略获取元数据失败的文件)
如果希望即使部分文件获取元数据失败,也能对成功的文件进行排序,可以用Promise.allSettled替代Promise.all:
async function sortEntriesByModificationDate(entries: Entry[], isAscending = false): Promise<Entry[]> { // 批量处理所有Entry,不管成功还是失败 const results = await Promise.allSettled(entries.map(entry => getEntryWithMetadata(entry))); // 过滤出成功获取元数据的条目 const successfulEntries = results .filter(result => result.status === 'fulfilled') .map(result => (result as PromiseFulfilledResult<{ entry: Entry, modificationDate: Date }>).value); // 执行排序 successfulEntries.sort((a, b) => { const dateA = a.modificationDate.getTime(); const dateB = b.modificationDate.getTime(); return isAscending ? dateA - dateB : dateB - dateA; }); return successfulEntries.map(item => item.entry); }
3. 使用示例
假设你已经通过Ionic Native的文件读取方法(比如file.listDir())拿到了Entry[],直接调用排序函数即可:
// 示例:读取目录并排序 async function loadAndSortFiles() { try { const entries = await file.listDir(file.externalRootDirectory, 'Documents'); const sortedEntries = await sortEntriesByModificationDate(entries); console.log('按修改日期排序后的文件:', sortedEntries); // 后续处理排序后的条目... } catch (error) { console.error('读取或排序文件失败:', error); } }
关键点说明
- 必须等待所有元数据都获取完成后再排序,否则会因为异步导致排序结果不正确
modificationDate返回的是字符串或时间戳,转换成Date对象后用getTime()比较更可靠- 可以通过
isAscending参数灵活切换升序/降序排列
内容的提问来源于stack exchange,提问作者brunobastosg
相关产品推荐
相关产品推荐

