迭代数组并等待 Promise

2023-12-25

如何使用 Promises 迭代数据数组并返回数据?我已经看到了一些 Promise.push(asyncFunc) 方法,但是我的数组中的一些条目将失败,因此根据我收集的信息,我无法使用它。

var filesFromDisk = [
    '41679_4_2015-09-06_17-02-12.mp4',
    '41679_4_2015-09-06_17-02-12.smil',
    '41680_4_2015-09-09_10-44-05.mp4'
];

start(filesFromDisk)
    .then((data) => {
        console.log(data); // Want my data here
});

I start start(dbFiles)来自另一个文件,这就是为什么我希望将数据返回到那里。

function start(dbFiles) {
    var listOfFiles = [],
        promises = [];
    return new Promise((fulfill, reject) => {
        for (var i = 0; i < dbFiles.length; i++) { 
            getMp4(dbFiles[i])
                .then((data) => {
                    listOfFiles = listOfFiles.concat(data);
                    console.log(listOfFiles);
                })
        }
        fulfill(listOfFiles) // Need to happen AFTER for loop has filled listOfFiles
    });
}

因此,对于数组中的每个条目,我想检查具有新扩展名的文件是否存在并读取该文件。如果扩展名的文件不存在,我将填充原始文件。我的Promise.all链工作并且所有数据都在上面的 for 循环中返回(getMp4(dbFiles[i]))

function getMp4(filename) {
    var mp4Files = [];
    var smil = privateMethods.setSmileExt(localData.devPath + filename.toString());
    return new Promise((fulfill, reject) => {
        Promise.all([
            privateMethods.fileExists(smil),
            privateMethods.readTest(smil)
        ]).then(() => {
            readFile(filename).then((files) => {
                fulfill(files)
            });
        }).catch((err) => {
            if (!err.exists) fulfill([filename]);
        });
    });
}

function readFile(filename){
    var filesFromSmil = [];
    return new Promise((fulfill, reject) => {
        fs.readFile(localData.devPath + filename, function (err, res){
            if (err) {
                reject(err);
            }
            else {
                xmlParser(res.toString(),  {trim: true}, (err, result) => {
                    var entry = JSON.parse(JSON.stringify(result.smil.body[0].switch[0].video));
                    for (var i = 0; i < entry.length; i++) { 
                        filesFromSmil.push(privateMethods.getFileName(entry[i].$.src))
                    }
                });
                fulfill(filesFromSmil);
            }
        });
    });
};

getMp4 中的 Promise.all 链中的方法 - 据我所知没有任何问题。

var privateMethods = {
    getFileName: (str) => {
        var rx = /[a-zA-Z-1\--9-_]*.mp4/g;
        var file = rx.exec(str);   
        return file[0];
    },
    setSmileExt: (videoFile) => {
        return videoFile.split('.').shift() + '.smil';
    },
    fileExists: (file) => {
        return new Promise((fulfill, reject) => {
            try {
                fs.accessSync(file);
                fulfill({exists: true})
            } catch (ex) {
                reject({exists: false})
            }
        })
    },
    readTest: (file) => {
        return new Promise((fulfill, reject) => {
            fs.readFile(file, (err, res) => {
                if (err) reject(err);
                else fulfill(res.toString());
            })
        })
    }
}

如果您需要它们并行运行,Promise.all是你想要的:

function start(dbFiles) {
    return Promise.all(dbFiles.map(getMp4));
}

这将启动getMp4对所有文件进行操作并等待它们全部完成,然后使用结果数组进行解析。 (getMp4将接收多个参数——值、索引和对dbFilesarary - 但由于它只使用第一个,所以没关系。)

Usage:

start(filesFromDisk).then(function(results) {
    // `results` is an array of the results, in order
});

只是为了完整性,如果您需要它们按顺序运行,您可以使用reduce图案:

function start(dbFiles) {
    return dbFiles.reduce(function(p, file) {
        return p.then(function(results) {
            return getMp4(file).then(function(data) {
                results.push(data);
                return results;
            });
        });
    }, Promise.resolve([]));
}

用法相同。请注意我们如何从一个已解决的承诺开始[],然后排队一堆then处理程序,每个处理程序接收数组,执行以下操作getMp4调用,当它得到结果时,将结果推送到数组上并返回它;最终的分辨率值是填充的数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代数组并等待 Promise 的相关文章

随机推荐

  • 为什么 MongoDB 在多线程客户端上比在单线程客户端上表现更好?

    我们最近使用 YCSB 对 Oracle 10g 和 MongoDB 进行了基准测试 https github com brianfrankcooper YCSB wiki https github com brianfrankcooper
  • Erlang mysql 示例

    只是想知道是否有人可以给出使用 erlang mysql 模块的工作示例 http code google com p erlang mysql driver http code google com p erlang mysql driv
  • 我可以使用 Lumen 在中间件中获取当前路线信息吗?

    我需要在中间件中拥有当前找到的控制器和操作 以便我可以进行一些身份验证 但我发现这是不可能的 因为管道就像 Middleware1 gt Middleware2 gt 进行调度 gt controller action gt Middlew
  • 了解为什么 drop.duplicates() 不起作用 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有一个 2 行 pandas 数据框 是通过对更大的数据框进行子集化而获得的 TransID rev offer qs lt
  • 使用 Discord.js 向频道发送消息时遇到问题 [重复]

    这个问题在这里已经有答案了 我正在尝试创建一个机器人 一旦用户发送特定消息 该机器人就会向频道发送消息 我已经设法让它在机器人登录后发送一条消息 但是client on 函数不会做任何事情 如果我做错了什么 请告诉我 提前谢谢 const
  • OpenCV中如何对复数矩阵求逆?

    我在做复杂矩阵的逆时遇到麻烦 据我所知 复杂矩阵只是一个双通道矩阵 CV 32FC2 CV 64FC2 假设我有一个矩阵 C Mat C 2 2 CV 64FC2 C at
  • 何时在 Ruby 中使用 `require`、`load` 或 `autoload`?

    我理解之间的细微差别require load and autoload在 Ruby 中 但我的问题是 你怎么知道使用哪一个 除了能够 包裹 load在匿名模块中 require似乎是首选 但是之后autoload允许您延迟加载文件 这听起来
  • 保持 Android 表格中所有行的列对齐

    我在 Android 上遇到了一个问题 无论我尝试什么都无法解决 想象一个表格布局 有 3 个表格行 每行有两个文本字段 Image 由于新用户限制 无法在此处添加图像 http imgim com tbl behaviour png 现在
  • 基于 Zend Framework 的项目

    在哪里可以看到具有漂亮架构的 ZF bssed 项目 数据映射器 服务等 这是一些应用程序 http www framework zend com wiki pages viewpage action pageId 14134 http w
  • 如何在GAE上设置中级证书?

    我为我的自定义域购买了 SSL 认证 并设置了我的 GAE 项目 在新的 Firefox 版本发布之前 它在大多数浏览器上都运行良好 Firefox 拒绝了我的 SSL 认证 我使用过 SSL Checker 它给了我反馈 并非所有网络浏览
  • 用于计费协议的 Paypal Webhook 收到付款了吗?

    是否有在收到计费协议付款时触发的 Webhook 我创建了一个计费计划 并让用户接受每月定期付款的计费协议 当计费协议执行时 webhookBILLING SUBSCRIPTION CREATED fires 是否有一个 webhook 在
  • 对多个文件运行 Excel 宏

    我有一个 Excel 宏保存在一个空白工作簿和多个数据工作簿中 目前 我分别打开宏文件和每个数据文件 并使用键盘快捷键在每个文件上运行宏 有没有一种方法可以在所有数据工作簿上运行宏而无需打开它们 或者使用 一个批处理文件 VBA VBScr
  • Google 地图 - 获取区域/邻里的多边形边界

    我想在 Google Maps API v3 上进行简单搜索 并得到带有彩色多边形的地图 如下图所示 搜索 皮涅罗斯 圣保罗 我通过使用得到它维基地图 http WikiMapia org data 步骤是 Open 维基地图 http W
  • 如何仅列出两次提交之间更改的文件名

    我在存储库中有一堆提交 我想查看两次提交之间更改的文件列表 来自SHA1 to SHA2 我应该使用什么命令 git diff name only SHA1 SHA2 您只需要包含足够的 SHA 哈希来识别提交 SHA 的顺序并不重要 输出
  • 如何使用 BertForMaskedLM 或 BertModel 来计算句子的困惑度?

    我想使用 BertForMaskedLM 或 BertModel 来计算句子的困惑度 所以我编写了这样的代码 import numpy as np import torch import torch nn as nn from transf
  • 创建一个链接,可在任何设备上打开相应的地图应用程序,并提供前往目的地的路线

    我宁愿认为这并不难找到 但看起来像您所期望的那样 找到一篇很棒的跨设备文章并不容易 我想创建一个链接 打开移动设备的浏览器并浏览谷歌地图 或者打开地图应用程序 Apple 地图或谷歌地图 并直接开始路线 即 从当前位置开始 在给定点结束 纬
  • 使用 CouchDB 的 jquery.couch.js?

    Here http blog couchone com post 1027100082 whats new in couchdb 1 0 part 4 securityn stuff http blog couchone com post
  • org.hibernate.exception.SQLGrammarException:无法插入[com.sample.Person]

    我正在尝试建立一个我发现的 Hibernate 小型工作样本here http www mastertheboss com hibernate 182 hibernate tutorial html但是 当我运行代码时 出现以下错误 Exc
  • C# 中的验证框架?

    在java世界里有bean验证框架JSR 303 http download oracle com otndocs jcp bean validation 1 0 fr oth JSpec 这是一个经过深思熟虑的策略 用于在应用程序的表示层
  • 迭代数组并等待 Promise

    如何使用 Promises 迭代数据数组并返回数据 我已经看到了一些 Promise push asyncFunc 方法 但是我的数组中的一些条目将失败 因此根据我收集的信息 我无法使用它 var filesFromDisk 41679 4