在javascript wrt不同的函数调用语法中,promisified控制流是如何导航的

在javascript wrt不同的函数调用语法中,promisified控制流是如何导航的,javascript,promise,Javascript,Promise,我有doSomething,doSomethingElse和finalHandler功能如下: function doSomething() { console.log('doSomething(): start'); return new Promise(function (resolve) { setTimeout(function () { console.log('doSomething(): end'); resolve(); }, 10

我有
doSomething
doSomethingElse
finalHandler
功能如下:

function doSomething() {
  console.log('doSomething(): start');
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log('doSomething(): end');
      resolve();
    }, 1000);
  });
}

function doSomethingElse() {
  console.log('doSomethingElse(): start');
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log('doSomethingElse(): end');
      resolve();
    }, 1000);
  });
}

function finalHandler() {
  console.log('finalHandler(): start');
  return new Promise(function (resolve) {
    setTimeout(function () {
      console.log('finalHandler(): end');
      resolve();
    }, 1000);
  });
}
我有一个函数
example1
,如下所示:

function example1() {
  doSomething().then(function () {
    return doSomethingElse();
  }).then(finalHandler);
}
他回来了

doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
我有
示例2

function example2() {
  doSomething().then(function () {
    doSomethingElse();
  }).then(finalHandler);
}
返回:

doSomething(): start
doSomething(): end
doSomethingElse(): start
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomethingElse(): start
doSomething(): end
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
示例3

function example3() {
  doSomething().then(doSomethingElse())
    .then(finalHandler);
}
返回:

doSomething(): start
doSomething(): end
doSomethingElse(): start
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomethingElse(): start
doSomething(): end
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
示例4

function example4() {
  doSomething().then(doSomethingElse)
    .then(finalHandler);
}
返回:

doSomething(): start
doSomething(): end
doSomethingElse(): start
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomethingElse(): start
doSomething(): end
finalHandler(): start
doSomethingElse(): end
finalHandler(): end
doSomething(): start
doSomething(): end
doSomethingElse(): start
doSomethingElse(): end
finalHandler(): start
finalHandler(): end
我可以理解,不同的函数调用语法会产生不同的结果——但这种行为背后的概念是什么


我不是在寻找一个修正或优化的代码。我想知道如何使用不同的语法导航流?

这里的概念-

  • 在从宏任务队列中拾取任务之前,微任务队列将在一个执行上下文结束时耗尽
  • 收回承诺是一项微观任务
  • setTimeout的回调是一个宏任务
  • Chained then将只等待previous then,如果previous then重新兑现承诺。如果不是承诺,那么下一个就不会等待上一个
  • 传递对函数的引用与调用函数不同。 例如1
  • doSomething()进入调用堆栈->doSomething():开始 它返回一个承诺,该承诺将在1秒后解析,然后调用“then”处理程序。 由于没有解决的承诺或任务,程序返回。如果在chrome中执行,则可以使用打印的未定义的进行验证。 1秒后,第一个承诺得到解决,该承诺在doSomething中排队。 作为console.log语句(“doSomething():end”);是同步的,它会被打印出来

    .then(function () {
        return doSomethingElse();
      })
    
    现在执行。 与上述流程相同- log('doSomethingElse():start');-->1秒后doSomethingElse结束 最后一次也是这样: console.log('finalHandler():start');-->在1sec console.log('finalHandler():end')之后

    示例2与示例1的不同之处在于,在第一个示例中,doSomethingElse会返回一个承诺。然后在那之后链接的将在执行之前等待该承诺得到解决 doSomethingElse返回一个承诺,我们不会在then处理程序回调中返回该承诺,这就是为什么将执行事件,并且将为doSomethingElse()设置setTimeout():结束,将立即执行then for final处理程序,因为它不会等待前一个承诺得到解决。 只有在前一个国家重新做出承诺的情况下,它才会等待。因此,首先打印finalHandler():start。在此之后,doSomethingElse超时和finalHandler超时的计时器都将过期,但之前的 超时将是任务队列中的第一个,因此它将首先被打印

    关于不同的格式。。 当您执行.then(doSomethingElse)时,您将传递一个对函数的引用,因此这与您在then.then()中复制doSomethingElse的完整代码相同。这是一个有效的回调。但是当您执行.then(doSomethingElse())时,它只执行函数doSomethingElse,但它不是回调,因此没有得到任何回调,它只是得到未定义,因此执行下一个then in链

    剩下的两个例子现在应该是不言自明的。

    “一个人只会期望以下输出”-呃,不,你为什么会期望这样?你知道<代码>是怎么回事吗?你能解释一下我对这个答案很不信服吗