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 的动态顺序执行 的相关文章

随机推荐

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

    在情节中 我可以创建一个直方图 例如在此示例中 文档中的代码 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