Promise 的动态顺序执行

2023-12-05

我有需要按顺序运行的动态数量的承诺。 我了解如何按顺序运行承诺,但我无法成功地使其与许多可能变化的承诺保持动态。

这是我发现静态执行此操作的一种方法如何兑现一个又一个的承诺? :

function waitFor(timeout) {
	return new Promise(function(resolve, reject) {
		setTimeout(function() {
			resolve(`Finished waiting ${timeout} milliseconds`);
		}, timeout);
	});
}

waitFor(1000).then(function(result) {
	$('#result').append(result+' @ '+(new Date().getSeconds())+'<br>');
    return waitFor(2000);
}).then(function(result) {
    $('#result').append(result+' @ '+(new Date().getSeconds())+'<br>');
    return waitFor(3000);
}).then(function(result) {
	$('#result').append(result+' @ '+(new Date().getSeconds())+'<br>');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="result"></div>

我想做同样的事情,但我不想有 3 个嵌套的 Promise,而是想要任何我想要的数字。 你能帮助我吗 ?

多谢!!


使用 Promise 可以通过三种基本方法来完成此任务。

  1. .reduce()图案。
function waitFor(timeout) {
	return new Promise(function(resolve, reject) {
		setTimeout(function() {
			resolve(`Finished waiting ${timeout} milliseconds`);
		}, timeout);
	});
}

var timeouts = [1000, 2000, 2000, 3000, 1000],
    sequence = tos => tos.reduce((p,c) => p.then(rp => waitFor(c))
                                           .then(rc => console.log(`${rc} @ ${new Date().getSeconds()}`)), Promise.resolve());

sequence(timeouts);
  1. 递归模式。
function waitFor(timeout) {
	return new Promise(function(resolve, reject) {
		setTimeout(function() {
			resolve(`Finished waiting ${timeout} milliseconds`);
		}, timeout);
	});
}

var timeouts = [1000, 2000, 2000, 3000, 1000],
    sequence = ([to,...tos]) => to !== void 0 && waitFor(to).then(v => (console.log(`${v} @ ${new Date().getSeconds()}`), sequence(tos)));

sequence(timeouts);
  1. 从左侧图案开始扫描。

The scanl模式会将 Promise 一个接一个地排序,但一旦完成,您还可以访问临时 Promise 决议。这在某些情况下可能很有用。如果您要惰性地构造一个异步树结构(仅在需要时从节点分支),您需要访问之前的 Promise 解析。

为了要达到scanlJS 中的功能,首先我们必须实现它。

var scanl = (xs, f, acc) => xs.map((a => e => a = f(a,e))(acc))

we feed scanl with xs这是这个特定示例中的超时数组,f这是一个回调函数,需要acc(累加器)和e(当前项)并返回新的累加器。累加器值(临时承诺决议)被映射到超时数组上,以便在需要时进行访问。

function waitFor(timeout) {
	return new Promise(function(resolve, reject) {
		setTimeout(function() {
			resolve(`finished waiting ${timeout} milliseconds`);
		}, timeout);
	});
}

var timeouts = [1000, 2000, 2000, 3000, 1000],
    scanl    = (xs, f, acc) => xs.map((a => e => a = f(a,e))(acc)),
    proms    = scanl(timeouts,                                             // input array
                     (a,t,r) => a.then(v => (r = v, waitFor(t)))           // callback function
                                 .then(v => (console.log(`${r} and ${v}`),
                                             `${r} and ${v}`)),
                     Promise.resolve(`Started with 0`));                   // accumulator initial value

// Accessing the previous sub sequential resolutions
Promise.all(proms)
       .then(vs => vs.forEach(v => console.log(v)));
.as-console-wrapper {
max-height: 100% !important
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise 的动态顺序执行 的相关文章

  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • 不和谐机器人 |不和谐.js |类型错误:无法读取未定义的属性“长度”

    我正在制作一个 Discord 机器人 并且正在使用 CodeLyon 的视频作为参考 该错误位于我的 message js 文件中 该文件包含以下内容 require dotenv config create cooldowns map
  • rxjs/Subject.d.ts 错误:类“Subject”错误地扩展了基类“Observable

    我从中提取了示例模板代码本教程 https github com gopinav Angular 2 Tutorials并执行以下两个步骤来开始 npm install worked fine and created node module
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • 在 .NET Core 中为 SPA 生成角度包时如何解决错误失败?

    当我执行该应用程序时 我收到两个红色失败消息 如下所示 通常 当类型或其他方面出现错误时 失败 Microsoft AspNetCore SpaServices 0 生成浏览器应用程序包 失败 Microsoft AspNetCore Sp
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构

随机推荐

  • 从直方图中获取值或从迹线中获取值

    在情节中 我可以创建一个直方图 例如在此示例中 文档中的代码 import plotly express as px df px data tips fig px histogram df x total bill fig show whi
  • Close 从未被明确调用过

    我有一个来自 sqlite 数据库的列表视图 我在几个不同的点调用 fillData 来更新列表视图 private void fillData mDbHelper open Cursor c mDbHelper fetchAllNotes
  • centos中imagemagick安装问题

    我正在尝试通过以下网址在我的服务器 centos 7 1 最低 上安装 imagemagick imagemagick安装步骤 在步骤 1 中出现此错误 Loaded plugins fastestmirror Loading mirror
  • 休眠正则表达式

    我正在尝试构建一个可以通过 HQL 正则表达式关键字进行搜索的 API 编辑 在 HQL 中执行正则表达式搜索的最佳方法是使用条件 Restrictions like 或 Restrictions ilike public static L
  • Android:在 OnItemClick 后替换 GridView 数组中的图像

    我有一个网格视图 大致如下所示 每个图像最终都会有所不同 当用户单击数组中的任何图像时 我希望该图像更改为 如果他们再次点击 它会变成这样 然后再次单击将恢复为 到目前为止 这是我的代码 只是使用 Imageadapter 创建一个 Gri
  • PHP:在 XML 中搜索字符串

    我尝试下面的搜索代码 但它只显示第一个子节点 我的代码中缺少什么吗 目录 xml
  • 使用 WCF 数据服务进行分页

    我的问题是关于如何使用 WCF 数据服务处理分页 我想要使 用它的方式是执行查询 传递页面大小和当前页面 并返回该查询的结果以及分页信息 例如总页数 当前页码和页面大小 客户端 这是另一个将结果转换为 JSON 供使用该结果的移动应用程序使
  • 连接向量中的相邻字符串

    Given qz lt quantile c 1 2 3 4 5 6 7 8 9 10 c 0 0 0 2 0 4 0 6 0 8 1 0 我想从分位数创建一个标签向量 目前 我这样做 zlab lt c paste paste sprin
  • 从另一个 2D 数组的元素中过滤 2D 数组

    我有两组数字元素存储为二维数组 使用以下方法从列中获取值 getValues 一个是完整列表 另一个是部分列表 我想要一个返回完整列表减去部分列表的函数 The partialListArr可能包含重复项 这fullListArr做 不是
  • Backbone:视图内的视图列表

    让我先展示我需要什么 以便您能够理解我的问题 我有一个联系人视图 例如 ContactView Backbone View extend template template Name E mail Phones render functio
  • R 语言的基本等值线州地图

    我很抱歉 因为我很确定这是一个基本问题 我想做的就是使用maps包在R中创建一个非常简单的等值线地图 这是我第一次尝试在 R 中映射任何数据 我所在的地区是美国本土 48 个州 包括华盛顿特区 这是我想要绘制的数据集的前几行 gt head
  • 调试密钥和签名密钥之间的区别

    您好 我正在尝试获取我的签名证书的签名密钥 MD5 指纹 有人可以告诉我签名密钥和调试密钥之间的区别吗 我能够指纹调试密钥 但为了获取签名密钥指纹 我很困惑 keytool list alias alias name keystore my
  • 如何从VB.Net中的DataGridView获取单元格值?

    我有一个问题 如何从 datagridview 的单元格中获取值 id p w post 1 1234 A 2 4567 S 3 6789 A 我想在文本框中输入3 该怎
  • 三元运算符的语法错误[重复]

    这个问题在这里已经有答案了 我是Python新手 我正在尝试使用具有这种格式的三元运算符 我认为是这样 value true if
  • 加特林如何在两个场景之间传递价值?

    我的脚本中有两个场景 我想将 CreateId 的值传递给第二个场景 我在第一个场景中保存了 CreateId 错误说 未定义名为 CreateId 的属性 jsonPath id find 0 exists 什么也没找到 场景 1 val
  • WinForms 中具有 alpha 通道透明度/不透明度的启动屏幕

    如何在 WinForms 中使用具有 alpha 通道透明度 不透明度的图像来实现启动屏幕 看一眼C 中的每像素 Alpha 混合
  • 文化特定数据注释

    我正在尝试获取特定于文化的数据注释 DisplayFormat DataFormatString 0 d public DateTime Date get set 我认为这会起作用 因此 在美国 它会显示 DD MM yyyy 在欧洲 它会
  • Snow Leopard、Django 和 PIL 的问题

    自从升级到 Snow Leopard 以来 我在让 Django 和 PIL 正常工作时遇到了一些问题 我已经安装了 freetype libjpeg 和 PIL 它告诉我 TKINTER support ok JPEG support o
  • 在 kotlin lambda 内部返回时“此处不允许返回”

    我使用 lambda 来处理异步调用的回调 我想在调用方法之外定义回调以避免使用庞大的方法 但我似乎无法在 lambda 中使用早期返回 这使得代码不必要地难以阅读 我尝试将 lambda 定义为变量 但 return 在 lambda 内
  • Promise 的动态顺序执行

    我有需要按顺序运行的动态数量的承诺 我了解如何按顺序运行承诺 但我无法成功地使其与许多可能变化的承诺保持动态 这是我发现静态执行此操作的一种方法如何兑现一个又一个的承诺 function waitFor timeout return new