当前位置: 首页 > news >正文

Promise面试题,控制异步流程

有这样一道关于promise的面试题,描述如下:

页面上有一个输入框,两个按钮,A按钮和B按钮,点击A或者B分别会发送一个异步请求,请求完成后,结果会显示在输入框中。

题目要求,用户随机点击A和B多次,要求输入框显示结果时,按照用户点击的顺序显示,举例:

用户点击了一次A,然后点击一次B,又点击一次A,输入框显示结果的顺序为先显示A异步请求结果,再次显示B的请求结果,最后再次显示A的请求结果。

UI界面如图:

clipboard.png

这个需求该如何用promise来实现呢?代码如下:

    //dom元素
    var a = document.querySelector("#a")
    var b = document.querySelector("#b")
    var i = document.querySelector("#ipt");
    //全局变量p保存promie实例
    var P = Promise.resolve();
    a.onclick  = function(){
        //将事件过程包装成一个promise并通过then链连接到
        //全局的Promise实例上,并更新全局变量,这样其他点击
        //就可以拿到最新的Promies执行链
        P = P.then(function(){
            //then链里面的函数返回一个新的promise实例
            return new Promise(function(resolve,reject){
                setTimeout(function(){
                    resolve()
                    i.value = "a";
                },1000)
            })
        })
    }
    b.onclick  = function(){
        P = P.then(function(){
            return new Promise(function(resolve,reject){
                setTimeout(function(){
                    resolve()
                    console.log("b")
                    i.value = "b"
                },2000)
            })
        })
    }

我们用定时器来模拟异步请求,仔细于阅读代码我们发现,在全局我们定义了一个全局P,P保存了一个promise的实例。

然后再观察点击事件的代码,用户每次点击按钮时,我们在事件中访问全局Promise实例,将异步操作包装到成新的Promise实例,然后通过全局Promise实例的then方法来连接这些行为。

连接的时候需要注意,then链的函数中必须将新的promise实例进行返回,不然就会执行顺序就不正确了。

需要注意的是,then链连接完成后,我们需要更新全局的P变量,只有这样,其它点击事件才能得到最新的Promise的执行链。

这样每次用户点击按钮就不需要关心回调执行时机了,因为promise的then链会按照其连接顺序依次执行。

这样就能保证用户的点击顺序和promise的执行顺序一致了。

大家有其他方法或者问题可以留言,或者直接发送消息。

clipboard.png

欢迎关注、转发、点击好看

相关文章:

  • opencv 增强现实(二):特征点匹配
  • CentOS 7 root口令恢复
  • [UOJ430]line
  • JavaScript 复习之 Object对象的相关方法
  • Fundebug计费标准解释:事件数是如何定义的?
  • mysql的备份脚本
  • mysql 数据库四种事务隔离级别
  • 题解 CF191C 【Fools and Roads】
  • springMvc学习笔记(2)
  • 【组队竞赛学习】vue+node在线商城项目
  • lucene排序算法之向量空间模型(一)
  • 常见的几种数组去重的方法,总有一种适合你~
  • Python网络爬虫5 - 爬取QQ空间相册
  • 数据库插入10000000数据
  • 聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [数据结构]链表的实现在PHP中
  • [译] 怎样写一个基础的编译器
  • ES6之路之模块详解
  • input的行数自动增减
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • js数组之filter
  • LeetCode18.四数之和 JavaScript
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • maya建模与骨骼动画快速实现人工鱼
  • opencv python Meanshift 和 Camshift
  • Spring框架之我见(三)——IOC、AOP
  • 每天一个设计模式之命令模式
  • 扑朔迷离的属性和特性【彻底弄清】
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 怎么把视频里的音乐提取出来
  • 字符串匹配基础上
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #pragma data_seg 共享数据区(转)
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #预处理和函数的对比以及条件编译
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (10)ATF MMU转换表
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (动态规划)5. 最长回文子串 java解决
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • *2 echo、printf、mkdir命令的应用
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net Stream篇(六)