You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于异步方法对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:10:39