当一个promise的resolve回调返回另一个promise时,它是如何工作的

When the resolve callback from one promise returns another promise, how does it work?

本文关键字:promise 何工作 工作 回调 一个 resolve 返回 另一个      更新时间:2023-09-26

在工作中,我们反复使用代码结构。我们都同意它确实有效,但我们不知道它为什么有效。这让我很不舒服。

我制作了一个小提琴,展示了代码结构的简化版本。它在运行。有人能告诉我发生了什么事吗?

http://jsfiddle.net/rhedin/zLbusowf/

谢谢。

我想网址不起作用。我已经更改了它,但这里还有代码:

function promiseAfter(seconds) {
  var promise = new Promise( (resolve) => {
    setTimeout(function () {resolve()}, 1000 * seconds)
  })
  return promise;
}
function dog() {
  console.log('Dog has started')
  cat().then(function () {
    console.log('In Dog. Cat has finished')
  })
  console.log('Dog has finished')
}
function cat() {
  console.log('Cat has started')
  return promiseAfter(1).then( () => {
    console.log('In Cat.  Outer promise satisfied')
    return promiseAfter(1).then( () => {
      console.log('In Cat.  Inner promise satisfied')
    })
  })
  console.log('Anything after the return stmt in Cat is never executed')
}
dog();

代码中发生的情况是:

dog()调用cat(),cat调用promise promiseAfter,完成通话。

它是如何工作的?

"cat"函数返回第一次调用"promiseAfter(1)"生成的promise,该promise与内部"promiseAfter(1))"返回的内部promise链接。所以cat只会被解析,当第一个"promiseAfter(1)"被解析时,调用"cat().then"的"then",而第一个"promiseAfter"只会在其内部"promiseAfter(1))被解析后被解析。

承诺和承诺链:

我看到你对嵌套的承诺有问题,所以我会尝试更详细地解释。

只是为了强化这个概念,promise是一个对象,"它表示一个尚未完成的操作,但有望在未来完成"(来自https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise),这个对象有一个名为"then"的方法,然后只有当你的promise对象被解析时才会触发,所以

var promise = new Promise( (resolve) => {
    setTimeout(function () {resolve()}, 1000 * seconds)
})
// below the anonymous function passed to ".then" will only be called after 1 second (after the timeout is triggered and resolve() is called)
promise.then(function() { ... })

现在,返回您的代码:

function cat() {
  return promiseAfter(1).then( () => { // will be resolved and call this anonymous function after 1 second
    console.log('In Cat.  Outer promise satisfied')
    return promiseAfter(1).then( () => { // will be resolved and call this anonymous function after the outer promise is resolved (1 second) and after 1 second has passed, so this will be called after 2 seconds
      console.log('In Cat.  Inner promise satisfied')
    })
  })
};

你已经知道promiseAfter(1)会给你一个承诺,这个承诺会在1秒后得到解决。问题是,外部promiseAfter(1)调用其"then"方法传递一个匿名函数,该函数返回另一个promiseAfter,这对这里发生的事情至关重要,在传递给外部promiseAfter(1)的.then方法的匿名函数中返回一个新的promise对象,这一事实使它采用内部promiseAfter的最终状态。因此,最终"cat()"将为您提供一个promise对象,该对象只有在最内部的"promiseAfter(1)"被解析时才会被解析,而内部对象只有在外部对象被解析后(1秒)和1秒后(1用于解析外部对象,加上1用于完成内部对象的setTimeout)才会被解析。enter code here