谈谈 异步事件 Promise 题型1

本文深入探讨了JavaScript中Promise的工作原理及其实现方式,并通过一个具体的面试题示例详细解析了Promise的状态变化过程及其在事件循环中的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

听到周围说面试中 promise 被问到的概率在98%以上 之前谈谈promise 写过 今天在卖弄一个题型

  • 首要说的状态
    Promise的三种状态 Pending进行中 Resolved已成功 Rejected已失败
    Pending 到 Resolved
    pending 到 Rejected
    一旦建立就会立即执行 无法中途取消
    不设置回调 内部抛出的错误不会反应到外

  • 例子

function loadUserInfo(id) {
    return new Promise(function (resolve, reject){
        http.get(XXX, function(data) {
            resolve(data)
        })
    })
}
loadUserInfo (id).then(function(data){
    //成功
},function(err){
    //失败
})复制代码

then 方法接受两个函数的参数 第一个是成功的回调 第二个是错误的回调

  • 面试题(自个扩展的)
    window.onload = function() {
       setTimeout(function(){
         console.log(1)
       },0)
       var issuccess = true
       var promise =new Promise(function(resolve, reject){
         console.log(2)
         if (issuccess) {
           resolve(console.log("成功"))
         } else{
           reject(console.log("错误"))
         }
         console.log(3)
       })
       promise.then(function(){
         console.log(4)
       }, function(){
         console.log(5)
       })

       console.log(6)
     }复制代码

问 最后输出什么
答案在下面 我来卖弄下这里的细节

  • 普及下异步 事件
  1. js是一个单线程的 也就是说一个时间点上只能做一件事情
    为啥不是多线程那 像Java那样 (网上加个人 见解) js作为浏览器脚本语言 主要是来根据跟用户的操作来操作dom 假如说多线程 第一个线程在dom上添加 第二线程在dom上删除 浏览器不知道依谁为主 所以这就是想JavaScript这样的脚本语言不能搞成多线程一原因吧

  2. 但是如果有很多操作 单线程一个不好的地方就是 要等上一个事情处理完才可以处理这个事情 导致性能 加载等等慢的很多 这个时候要实现异步操作 可是单线程如果搞那

  3. js的异步是通过回调函数来实现的 (线程+任务队列) 线程主完成主要操作(同步的事情) 线程ok以后开始轮训任务队列 通过回调取出来执行

    总结下 开始执行 1. 线程上执行所以操作(同步) 2.线程外开辟一个任务队列 只要异步任务有了结果就在任务队列中放置一个事件 3. 线程上ok后 系统会自动读取任务队列里面事件 4. 线程重复上面

  • promise 任务队列执行优先级
    es6中新增了一个Promise 在事件循环上 每次循环时候 先去es6Promsie 队列中是否有任务执行 Promise 队列优先高 也就是说线程ok了 去执行队列栈中取出事件 上来Promise任务会首先执行 其他就没有优先级
  • 看看上面那道题吧

    线程开始执行操作(同步)
    任务队列中 Promise有 优先级
    setTimeout 加入任务队列

    1. 打印是 2 //没毛病吧 因为属于主操作
    2. 打印是 成功 //没毛病
    3. 打印是 3 //没毛病
    4. 打印是 6 // .then 的回调在任务队列上
      线程上ok了 现在是任务队列上的了
    5. 打印是 4 //上面说了Promise有优先级
    6. 打印是 1 //任务队列中最后

参考: es6.ruanyifeng.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值