- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
for (let i = 0; i < 10; i++) {
const promise = new Promise((resolve, reject) => {
const timeout = Math.random() * 1000;
setTimeout(() => {
console.log(i);
}, timeout);
});
// TODO: Chain this promise to the previous one (maybe without having it running?)
}
6
9
4
8
5
1
7
2
3
0
.then()
)。
yield
),尝试了返回 promise 的简单函数,但最终它总是归结为同样的问题:
循环是同步的 .
async.series()
.
最佳答案
正如您在问题中已经暗示的那样,您的代码会同步创建所有 promise 。相反,它们应该只在前一个解决时创建。
其次,使用 new Promise
创建的每个 promise 需要调用 resolve
来解决(或 reject
)。这应该在计时器到期时完成。这将触发任何 then
回调你会在那个 promise 上。还有这样的then
回调(或 await
)是实现链的必要条件。
有了这些成分,有几种方法可以执行这种异步链接:
for
以立即解决的 promise 开始的循环Array#reduce
从立即解决的 promise 开始async
/ await
syntaxfor await...of
syntaxsetTimeout
使用
setTimeout
很好,但我们实际上需要一个在计时器到期时解决的 promise 。所以让我们创建这样一个函数:这被称为promisifying一个函数,在这种情况下我们将promisify
setTimeout
.它将提高代码的可读性,并可用于上述所有选项:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
请参阅以下每个选项的片段和评论。
for
您可以使用
for
循环,但您必须确保它不会同步创建所有 promise 。相反,您创建一个初始的立即解决 promise ,然后在之前的 promise 解决时链接新的 promise :
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
for (let i = 0, p = Promise.resolve(); i < 10; i++) {
p = p.then(() => delay(Math.random() * 1000))
.then(() => console.log(i));
}
then
来电。变量
p
仅用于不丢失该链的跟踪,并允许循环的下一次迭代在同一链上继续。回调将在同步循环完成后开始执行。
then
-callback 返回
delay()
的 promise 创建:这将确保异步链接。
reduce
这只是对先前策略的一种更实用的方法。您创建一个与要执行的链长度相同的数组,并从立即解决的 promise 开始:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
[...Array(10)].reduce( (p, _, i) =>
p.then(() => delay(Math.random() * 1000))
.then(() => console.log(i))
, Promise.resolve() );
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
(function loop(i) {
if (i >= 10) return; // all done
delay(Math.random() * 1000).then(() => {
console.log(i);
loop(i+1);
});
})(0);
loop
的函数,并且在代码的最后,您可以看到它立即使用参数 0 调用。这是计数器和 i 参数。如果该计数器仍低于 10,该函数将创建一个新的 Promise,否则链接将停止。
delay()
解决,它将触发
then
回调将再次调用该函数。
async
/
await
现代 JS 引擎
support this syntax :
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
(async function loop() {
for (let i = 0; i < 10; i++) {
await delay(Math.random() * 1000);
console.log(i);
}
})();
async
函数在执行第一个
await
时返回.每次等待的 promise 解决时,函数的运行上下文都会恢复,并在
await
之后继续。 , 直到遇到下一个,所以它继续直到循环结束。
for await...of
在 EcmaScript 2020 中,
for await...of
找到了现代 JavaScript 引擎的方式。尽管在这种情况下它并没有真正减少代码,但它允许将随机区间链的定义与它的实际迭代隔离开来:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function * randomDelays(count, max) {
for (let i = 0; i < count; i++) yield delay(Math.random() * max).then(() => i);
}
(async function loop() {
for await (let i of randomDelays(10, 1000)) console.log(i);
})();
关于JavaScript ES6 promise for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328932/
如何从 promise 中退出 promise ? perl6 文档没有提供简单的方法。例如: my $x = start { loop { # loop forever until "qui
我的用户 Controller 中有一个索引操作,其中我试图连续做两件事,并且在它们都有机会完成之前不执行所需的 res.json() 方法。 我有一个加入用户的友谊加入模型。一列是 friender
请帮我解释一下为什么日志结果有两种不同: 方式 1:每 1 秒顺序记录一次 方式 2:1 秒后记录所有元素。 // Way 1 let sequence = Promise.resolve(); [1
我的问题很简单。 Promise.all() 方法可以返回 Promise 吗?让我解释一下: function simpleFunction() { let queue = [];
我正在使用 Promise 从存储中读取文件并转换为 base64 字符串。我有图像数组,使用 RNFS 读取图像 const promise_Images = _Images.map(async (
如果使用非空数组调用 Promise.all 或 Promise.race,它们将返回一个待处理的 Promise: console.log(Promise.all([1])); // prints
Promise.all 是否可以在没有包装 promise 的情况下返回链的最后一个值? 如果不使用 await,它在我的上下文中不起作用 没有包装的例子: function sum1(x){ r
我一直在玩 promise,通常能想出如何处理好它们,但在这种情况下,我不知道如何删除一个 promise-wrapping level。 代码如下: let promise2 = promise1.
考虑以下嵌套的Promises结构: const getData = async() => { const refs = [{ name: "John33", age: 3
我已经阅读了 Promise/A+ 规范,但据我了解,还有诸如 Promise/A 和 Promise 之类的东西。它们之间有什么区别? Promise 和 Promise/A 规范也是如此吗?如果是
当我运行以下代码时: my $timer = Promise.in(2); my $after = $timer.then({ say "2 seconds are over!"; 'result'
以下简单的 promise 是发誓的,我不允许打破它。 my $my_promise = start { loop {} # or sleep x; 'promise re
我正在尝试扩展Promise: class PersistedPromise extends Promise { } 然后在派生类上调用静态resolve以直接创建一个已解决的Promise: Per
我有两个返回 promise 的函数,我独立使用它们作为: getLocal().then(...) 和 getWeb().then(...) 但是现在我遇到了一个奇怪的问题: 1) 我需要第三个
我不知道 promise.all 解决方案中的 promise.all 是否是一个好的实践。我不确定。 我需要从一组用户获取信息,然后通过此信息响应,我需要发送消息通知。 let userList =
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为: ([ 30 seconds wait. 4 ]promiseValue )then:
大家好,提前感谢您的帮助。 下面是我正在尝试做的事情 function1(){ throw some error(); } function2() { // dosomething suc
我有以下未解析的代码。f2 解决了,所以我不会添加该代码,它是 f1 我有问题。 我调用函数,它到达最里面如果,它调用函数“find”,它执行函数 findId,完美返回 Id,然后执行 editId
我是一名优秀的程序员,十分优秀!