Promise的执行顺序

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

          一时间陷入沉思,意向的结果应该是:"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"才反应过来--“我还没上车(计时器刚刚结束)”,然后再去运行计时器内部的程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 JavaScript 中,Promise执行顺序可以分为以下几个步骤: 1. 创建 Promise 对象:使用 `new Promise()` 构造函数创建一个 Promise 对象,并传入一个执行器函数作为参数。 2. 执行器函数:执行器函数会立即执行,并接收两个参数,分别是 `resolve` 和 `reject`。在执行器函数中,你可以编写异步操作的代码逻辑。 3. 异步操作:在执行器函数中,你可以编写异步操作的代码,如异步请求、文件读取等。当异步操作完成时,可以调用 `resolve` 方法将 Promise 置为成功状态,或调用 `reject` 方法将 Promise 置为失败状态。 4. 状态改变:当调用 `resolve` 或 `reject` 方法后,Promise 的状态将发生改变。如果调用了 `resolve`,Promise 的状态将变为成功(fulfilled);如果调用了 `reject`,Promise 的状态将变为失败(rejected)。 5. 注册回调函数:可以使用 `then()` 方法来注册成功状态的回调函数,或使用 `catch()` 方法来注册失败状态的回调函数。这些回调函数将在 Promise 的状态发生改变后被调用。 6. 链式调用:通过链式调用 `then()` 方法,可以将多个回调函数串联起来,并且每个回调函数可以返回一个新的 Promise 对象,实现链式异步操作。 需要注意的是,Promise 是非阻塞的,即在执行异步操作时,JavaScript 主线程可以继续执行其他任务,而不会等待 Promise 的结果。当 Promise 的状态改变后,相关的回调函数才会被调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值