Promise的执行顺序

在浏览MDN有关Promise部分时遇到了一个很有意思的案例,具体代码如下:

Promise的执行顺序_第1张图片

          一时间陷入沉思,意向的结果应该是:"foobar"=>"foobarbaz"=> "最后一个 then:哎呀……之前懒得实例化并返回一个 Promise,所以顺序可能有点令人惊讶"以及"foobarbaz"

但实际结果出乎意料 :

理解中本应最后执行的部分,反而最先弹出,这到底是为什么?

         实际上这三部分确实是顺次执行的(这里我分别设为F1,F2,F3)

在解释执行结果之前,先引入一个概念:“链式调用”(这里为MDN上所给的注解):

   then 方法返回一个新的 Promise,从而允许链式调用。

         如果作为 then() 方法的处理函数传递的函数返回一个 Promise,则相应的 Promise 对象将被暴露给方法链中的后续 then() 方法。下面的代码段使用 setTimeout 函数来模拟异步代码操作。

        通俗来讲:也就是Fn会等待Fn-1的返回值,当拿到Fn-1的返回值后,Fn才会开始执行
        问题也就是出现在这里:为什么F3比F2先执行?(好吧,我承认,第一次看的时候我也想错了)实际上F3确实是在F2后面执行的,但是F2这个家伙不太厚道(注意F2由两部分组成setTimeout和return)

        在F2执行的过程中,同时获取到“setTimeout”和“return”两部分;但是由于setTimeout自身的延后性(也就是会延后进行),导致return先执行,这个时候F3拿到的是“return”返回的结果,而非经过“setTimeout“处理的结果;

        等到F3运行结束之后,F2中的“setTimeout"才反应过来--“我还没上车(计时器刚刚结束)”,然后再去运行计时器内部的程序

你可能感兴趣的:(es6)