Promise.each()

news/2024/10/18 23:13:27

原文:

http://bluebirdjs.com/docs/api/promise.each.html

 

正文:

Promise.each 是一个异步迭代函数,它接受一个可迭代对象(例如数组)或一个可迭代对象的 Promise,并在每个元素上执行给定的迭代器函数。如果元素是一个 Promise,迭代器会等待它解决后再继续。迭代器函数的签名是(value, index, arrayLength),其中 value 是当前元素(如果它是一个 Promise,则为其解决后的值)。

如果在任何步骤中:

  • 迭代器返回了一个 Promise 或一个 thenable,会等待它解决后再继续下一个迭代。
  • 当前迭代的元素是一个待解决的 Promise,会等待这个 Promise 解决后再运行迭代器。
  • 当前迭代的元素是一个被拒绝的 Promise,迭代将停止,并且也会以同样的原因被拒绝。

如果所有迭代都成功解决,Promise.each 调用将解决为一个新数组,包含原始输入元素的解决值。

Promise.eachPromise.mapSeries 非常相似。Promise.eachPromise.mapSeries 之间的差异在于它们的解决值。Promise.each 如上所述解决为一个数组,而 Promise.mapSeries 解决为一个数组,其中包含迭代器函数在每一步的输出。这样,Promise.each 主要用于副作用操作(因为迭代器的输出基本上被丢弃了),就像数组的原生 .forEach() 方法一样,而 Promise.map 用作数组的原生 .map() 方法的异步版本。

基本示例:

javascript
// 要迭代的数组可以是值和 Promise 的混合。
var fileNames = ["1.txt", Promise.resolve("2.txt"), "3.txt", Promise.delay(3000, "4.txt"), "5.txt"];Promise.each(fileNames, function(fileName, index, arrayLength) {// 迭代将顺序执行,等待过程中的任何 Promise。return fs.readFileAsync(fileName).then(function(fileContents) {// ...// 迭代器的最终解决值是不相关的,因为 `Promise.each` 的结果与迭代器的输出无关。return "anything"; // 不重要});
}).then(function(result) {// 这将在最后一步完成后运行console.log("Done!");console.log(result); // ["1.txt", "2.txt", "3.txt", "4.txt", "5.txt"]
});

包含数组中被拒绝 Promise 的示例:

javascript
// 如果原始数组中的一个 Promise 被拒绝,
// 一旦遇到它,迭代将停止
var items = ["A", Promise.delay(8000, "B"), Promise.reject("C"), "D"];Promise.each(items, function(item) {return Promise.delay(4000).then(function() {console.log("On iterator: " + item);});
}).then(function(result) {// 这不会运行
}).catch(function(rejection) {console.log("Catch: " + rejection);
});// 上面的代码在 12 秒后输出以下内容(不是 16 秒!):
// On iterator: A
// On iterator: B
// Catch: C

解释:Promise.each 函数用于按顺序处理数组中的每个元素,如果元素是 Promise,则会等待它解决。如果迭代器函数返回一个 Promise,会等待它解决后再继续。如果遇到被拒绝的 Promise,迭代将停止。如果所有迭代都成功,Promise.each 将解决为一个包含原始输入元素解决值的数组。这与 Promise.mapSeries 不同,后者会解决为一个包含迭代器函数输出的数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

transformers 推理 Qwen2.5 等大模型技术细节详解(一)transformers 初始化和对象加载(文末免费送书)

本文详细讲解 transformers 推理大语言模型的初始化过程,包括 Python 包搜索、LazyModule 延迟模块、模块搜索和 Python 包 API 设计美学……上周收到一位网友的私信,希望老牛同学写一篇有关使用 transformers 框架推理大模型的技术细节的文章。 老牛同学刚开始以为这类的文章…

UI开发概述

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs…

MiGPT让你的小爱音响更聪明

大家好,我是晓凡。 今天要给大家带来一个超级有趣的开源项目MiGPT。 这个项目,简直就是给小爱音箱装上了超级大脑,让你的小爱音箱更聪明。 想象一下,当小爱音箱接入大模型后,上知天文,下知地理,从“人工智障”秒变学霸。 一、什么是MiGPTMiGPT是一个由idootop团队开发的…

基于amis后端低代码平台

写这个平台是为了解决多年对于项目的困扰,不想碰到新项目就重新来,通过业务模块的积累,能进行模块化安装。新的项目只需要安装模块就能搭建一套完整的业务系统。amis-api 的所有基础代码都以模块的形式组合在一起。这些模块可以随时从数据库中安装或卸载。这些模块有两大目的…

数据采集与融合技术实验课程作业一

数据采集与融合技术实验课程作业一作业所属课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13286gitee码云代码位置 https://gitee.com/wang-qi…

C3P0 链子分析学习

C3P0 链子分析学习 概述 C3P0是一个开源的数据库连接池,它实现了数据源与JNDI绑定,支持JDBC3规范和实现了JDBC2的标准扩展说明的Connection和Statement池的DataSources对象。即将用于连接数据库的连接整合在一起形成一个随取随用的数据库连接池,使用它的开源项目有Hibernate…

鞅与停时定理

好用、神秘、很牛的东西!鞅与停时定理会随着呆猫做题更新一些,但是非题解部分的改动应该不大呆猫不会数学,要证明也是直接抄别人的,不如直接放一篇( 详细证明及介绍 主要写点,对鞅与停时定理的理解 定理与势能函数 对于一个随机过程\(\{X_0,X_1,...,X_t\}\),其中\(X_t\)…

20241018每日一题洛谷P2386

普及 每日一题 信息学竞赛 1206:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N…