使用函数的链式承诺不 return 所需的回调序列

Chain promise using functions doesn't return desired callback sequence

1.I 正在尝试通过在全局 promise 对象上使用函数来链接一些 promise。链式序列并不像我想的那样起作用。以下代码输出 1 3 4 2。 2.I 想知道这是什么原因。我的想法是在变量声明传递中,p.then() 函数已注册但未注册其以下承诺,直到 p.then() 函数 returns,它才开始将第二个 then 函数推入回调队列。

为了回答我为什么要这样做的问题,我试图对一系列操作使用构建器模式。 例如,builder().setupTestEnv().connectToDatabase().setupAuthServer().setupAuthClient()。此链中的每个函数都旨在执行 _globalPromiseObject.then() 以链接后续操作。

我知道另一种解决方案是,使用 execute() 调用结束构建器链,其中 运行 Q.all() 到 运行 按顺序执行所有承诺。但只是对承诺链的这种行为感到好奇。

const Q = require('q');

const p = Q();

p
.then(
    function(){
        console.log(1);
    }
)
.then(
    function(){
        console.log(2);
    }
);

function foo(){
    p.then(
        function () {
            console.log(3);
        }
    );
}

function bar(){
    p.then(
        function () {
            console.log(4);
        }
    );
}

foo();
bar();

不确定这是否 100% 回答了您的问题,但从您的示例中有意义的陈述的角度来看这个问题可能会有所帮助:

  1. p.then()
  2. foo()
  3. bar()
  4. 最后,#1 的 then 触发了

这三个操作紧接着发生,同步。让我们删除 foobar 包装器,就好像您编写了它们的内容而不是调用它们:

  1. p.then(/* log 1 */)
  2. p.then(/* log 3 */) foo
  3. 的内容
  4. p.then(/* log 4 */) 条的内容
  5. 最后,#1 的 then 触发了

您可以从各自的函数中 return foo()bar(),然后将 foobar 传递给 .then() .then(foo).then(bar)return foo()bar() 来自 .then(function(){ return foo() })

const p = Promise.resolve();

p
  .then(
    function() {
      console.log(1);
    }
  )
  .then(
    function() {
      console.log(2);
    }
  )
  .then(function() {
    return foo()
  })
  .then(function() {
    return bar()
  })

function foo() {
  return p.then(
    function() {
      console.log(3);
      return
    }
  );
}

function bar() {
  return p.then(
    function() {
      console.log(4);
      return
    }
  );
}