当前位置: 首页 > 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数据
  • 聊天宝彻底凉了,遭罗永浩抛弃,团队就地解散
  • ----------
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【Amaple教程】5. 插件
  • Android交互
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • VuePress 静态网站生成
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 浮现式设计
  • 译自由幺半群
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云ACE认证学习知识点梳理
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $().each和$.each的区别
  • (007)XHTML文档之标题——h1~h6
  • (42)STM32——LCD显示屏实验笔记
  • (java)关于Thread的挂起和恢复
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (笔试题)分解质因式
  • (过滤器)Filter和(监听器)listener
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)理解angular中的module和injector,即依赖注入
  • (算法设计与分析)第一章算法概述-习题
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一一四)第九章编程练习
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .dwp和.webpart的区别
  • .Net Core和.Net Standard直观理解
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .考试倒计时43天!来提分啦!
  • [20140403]查询是否产生日志
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [51nod1610]路径计数
  • [Android Pro] Notification的使用
  • [Angularjs]ng-select和ng-options
  • [HDU 3555] Bomb [数位DP]