有这么一道关于promises的面试题,描述如下:页面有一个输入框,两个按钮,A按钮和B按钮,点击A或者B会发送一个分别异步请求,请求完成后在输入框中显示结果。题目要求用户随机点击A和B多次。当需要输入框显示结果时,按照用户点击的顺序显示。例如:用户点击一次A,再点击一次B,再点击一次A,输入框显示结果的顺序为先显示A的异步请求结果,再显示B的请求结果,最后再次显示A的请求结果。UI界面如图:如何使用promise实现这个需求?代码如下://dom元素vara=document.querySelector("#a")varb=document.querySelector("#b")vari=document.querySelector("#ipt");//保存全局变量pPromie实例varP=Promise.resolve();a.onclick=function(){//将事件流程包装成promise并通过then链连接到//全局Promise实例,并更新全局变量,以便其他点击//可以获取到最新的Promise执行链P=P.then(function(){//then链中的函数返回一个新的promise实例returnnewPromise(function(resolve,reject){setTimeout(function(){resolve()i.value="a";},1000)})})}b.onclick=function(){P=P.then(function(){returnnewPromise(function(resolve,reject){setTimeout(function(){resolve()控制台。log("b")i.value="b"},2000)})})}我们使用定时器来模拟异步请求。仔细阅读代码后,我们发现在globalus定义了全局P。P保存了一个promise实例,然后观察点击事件的代码。每次用户点击按钮,我们在事件中访问全局的Promise实例,将异步操作包装到一个新的Promise实例中,然后通过全局Promise实例的then方法将这些行为串起来。连接时需要注意then链的函数必须返回一个新的promise实例,否则执行顺序会不正确。需要注意的是then链连接完成后,我们需要更新全局P变量。只有这样其他的点击事件才能得到最新的Promise执行链。这样用户每次点击按钮时,都不需要关心回调的执行时机,因为promise的then链会按照它的连接顺序依次执行。这样可以保证用户点击的顺序和promise执行的顺序一致。如果有其他方法或者问题可以留言,或者直接发消息。欢迎关注、转发、点击看好看
