javascript - 为什么 promise 在循环中的工作方式不同?

标签 javascript promise

<分区>

我在 Promise.then 方法中使用了 delay 函数生成器

function delay(msec) {
    return (value) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(value);
            }, msec);
        });
    }
}

当我在没有循环的情况下使用 delay 函数时,它工作正常:

var promise = Promise.resolve();
promise
    .then(() => console.log(1))
    .then(delay(1000))
    .then(() => console.log(2))
    .then(delay(1000))
    .then(() => console.log(3))
    .then(delay(1000));

但是当我在循环中使用它时,所有数字都会被毫无延迟地打印出来:

var loopPromise = Promise.resolve();
for (let i = 1; i <= 3; i++) {
    loopPromise
        .then(() => console.log(i))
        .then(delay(1000));
}

为什么 promise 在循环中的工作方式不同?我该如何解决这个循环行为?

最佳答案

Why promises work differently in loops?

如果我们展开循环版本,您就是这样做的:

var loopPromise = Promise.resolve();

loopPromise
    .then(() => console.log(1))
    .then(delay(1000));

loopPromise
    .then(() => console.log(2))
    .then(delay(1000));

loopPromise
    .then(() => console.log(3))
    .then(delay(1000));

IE 中的每一个调用都直接进入 loopPromise 并立即被调用,而不是被链接起来。

How i can fix this loop behavior?

最简单的方法是通过覆盖原始 Promise 变量来跟踪每次迭代中链的最新部分:

var loopPromise = Promise.resolve();
for (let i = 1; i <= 3; i++) {
    loopPromise = loopPromise
        .then(() => console.log(i))
        .then(delay(1000));
}

关于javascript - 为什么 promise 在循环中的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163367/

相关文章:

javascript - 自执行功能是否准备好在 dom 上运行?

javascript - 顶点颜色变为白色

javascript - 如何在 JS/TS 函数式编程中使用箭头函数作为属性

javascript - Node.js Promise 在没有被调用的情况下运行

AngularJS 资源 promise

javascript - Angular $http 返回数据但不适用于范围

java - 使用 rhino 或闭包编译器从 java 更改 javascript 变量和函数名称

javascript - 使用 Promise.all().then() 动态设置参数

javascript - 通用 promise 重试逻辑

node.js - 使用 res.send() 进行 promise ;