在承诺链中,承诺本身是同步创建的还是异步创建的?

In a promise chain, are the promises themselves created synchronously or asynchronously?

提问人:gus 提问时间:6/18/2023 最后编辑:gus 更新时间:6/18/2023 访问量:80

问:

我之前在这里问过一个问题,但现在出现了新的疑问,我想证实一下。

承诺链中,所有承诺是同步创建的,还是作为属于 )// 的 )// 创建的?callbacksthen(finally()catch()

let promise1 = Promise.resolve('Stackoverflow');
    promise1
      .finally(() => {
        console.log('finally()');
      }) // promise 2
      .then((data) => {
        console.log('Data: ' + data);
      }) // promise 3
      .catch((rejection) => {
        console.log('rejection: ' + rejection);
      }); // promise 4

也就是说,在执行 // 之前创建的 和 promise 是否被执行?promise 2promise 3promise 4then()finally()catch()callbacks

JavaScript 异步 承诺

评论

0赞 DecPK 6/18/2023
只需在之前和之后添加日志并亲自查看即可。查看顺序
4赞 jonrsharpe 6/18/2023
然后,这些方法捕获并最终存在于 promise 对象上,因此必须创建 promise 以接收回调,然后才能执行它们。
4赞 jonrsharpe 6/18/2023
同样,他们必须如此。回调被传递给 promise 的方法,然后 promise(如果需要)执行它们。
1赞 Bergi 6/18/2023
是的。承诺不是魔法。它们可以用普通代码实现,普通的方法调用具有普通行为。
2赞 Bergi 6/19/2023
我什至认为,术语“承诺链”仅指创建承诺和发生链式方法调用的第一阶段。但是“承诺链”由这两件事组成,是的——已经创建的承诺和将它们链接在一起的处理函数。

答:

1赞 jabaa 6/18/2023 #1

在承诺链中,方法 和 立即同步调用,回调函数作为参数。要求还立即同步创建承诺。否则,无法调用这些方法。稍后在解析或拒绝 promise 时调用回调函数。thenfinallycatch

Promise.resolve('Stackoverflow')返回一个 promise。

promise1.finally在 promise 上调用方法并返回 promise(同步)promise1

.then对上一个 promise 调用方法并返回新 Promise(同步)

.catch对上一个 promise 调用方法并返回新 Promise(同步)

此方法中的每一个都获取一个回调函数作为参数。稍后,当 promise 被解析或拒绝时,将调用回调函数。

评论

0赞 gus 6/18/2023
".then() 调用一个方法“, ”.catch() 调用一个方法“ - 你这是什么意思?@jabaa
0赞 jabaa 6/18/2023
@gus 始终对对象调用方法。 是指向 的函数的函数调用。promise1.then()thenthispromise1
0赞 gus 6/18/2023
我明白了,我以为你的意思是不同的。在你发布的“旁白”中,一结束,异步代码就开始了吗?@jabaa
0赞 jabaa 6/18/2023
@gus 异步代码在触发它时启动,例如按钮单击、计时器、网络响应...... 就像一个超时为 0 的计时器。我在事件循环中将一个事件排入队列。Promise.resolve
3赞 jabaa 6/18/2023
@gus 这就是OOP的工作方式。这与承诺无关。 是方法链。 被调用。 在 的返回值上调用,并在 的返回值上调用。a.b().c().d()baca.b()da.b().c()