javascript - 在这种情况下,我如何理解 Promise all?

标签 javascript promise es6-promise

我想做一个同步任务并尝试了类似下面的代码,这与我之前对 Promise 的想法不同,你能帮我解释一下吗?

var p2 = new Promise((resolve, reject) => {
  console.log('Promise 2');
  resolve();
});

var p1 = new Promise((resolve, reject) => {
  console.log('Promise 1');
  resolve();
});

Promise.all([p1]).then(p2);

它总是在“Promise 1”之前输出“Promise 2”。

最佳答案

当您调用 new Promise 时,您传入其中的函数(promise 执行器)会在您收到 Promise 之前立即运行返回并将其存储在您的变量中。原因是 promise executor 函数的工作是启动一个异步进程。如果不调用它就无法启动它。这就是为什么您会在“Promise 1”之前看到“Promise 2”,因为这是您调用 new Promise 的顺序。

还要注意 Promise.all 不会启动任何东西。它只是监视已经在进行的过程并报告结果。

下面是 new Promise 的一个更实际的用法,可以帮助您理解事情的时间安排:启动计时器并在计时器触发时解决 promise :

function timer(ms, value) {
    return new Promise(resolve => {
        console.log(`promise executor called for value "${value}"`);
        setTimeout(() => {
            console.log(`timer completed for value "${value}", resolving promise`);
            resolve(value);
        }, ms);
    });
}

// Note that I never do anything with the promise `timer` returns
// here, but since it's already started by the time
// it returns, it still does something
console.log("creating anonymous");
timer(800, "anonymous");

console.log("creating p1");
const p1 = timer(1600, "p1");
console.log("creating p2");
const p2 = timer(2400, "p2");
console.log("calling Promise.all([p1, p2])");
Promise.all([p1, p2])
.then(results => {
    console.log(`Promise.all promise reseolved with "${JSON.stringify(results)}"`);
})
.catch(error => {
    // Normally you'd handle errors here, it's just
    // that the promsies from `timer` are never rejected
});
.as-console-wrapper {
    max-height: 100% !important;
}

关于javascript - 在这种情况下,我如何理解 Promise all?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61823020/

相关文章:

javascript - webpack、react 和 babel : Uncaught TypeError: Super expression must either be null or a function, 未定义

javascript - promise 创建中的 "this"是什么?

javascript - 调用异步函数返回带有属性名称数字的 Promise 对象

javascript - 了解 promise 链

javascript - 在上一个动画完成后用 javascript 重新触发 CSS 动画

javascript - Angular.noop 有什么用?

javascript - 将持久过滤器应用于表排序器表

javascript - 基于 Promise 的异步 setTimeout? promise  {<pending>} 错误

javascript - angularjs Controller 中的 Promise - 如何实现

react-native - 如何在 Fetch 的 promise 链之外获取响应数据?