一道前端面试题目

题目:

某个应用模块由文本框 input,以及按钮 A,按钮 B 组成。点击按钮 A,会向地址 urlA 发出一个 ajax 请求,并将返回的字符串填充到 input 中(覆盖 input 中原有的数据),点击按钮 B,会向地址 urlB 发出一个 ajax 请求,并将返回的字符串填充到 input 中(覆盖 input 中原有的数据)。

当用户依次点击按钮 A、B 的时候,预期的效果是 input 依次被 urlA、urlB 返回的数据填充,但是由于到 urlA 的请求返回比较慢,导致 urlB 返回的数据被 urlA 返回的数据覆盖了,与用户预期的顺序不一致。

请问如何设计代码,解决这个问题?
原文见这里:如果你想靠前端技术还房贷,你不能连这个都不会

使用promise的解决方法如下:

var promise = Promise.resolve()

$('.btn1').click(() => {
  promise = promise.then(() => {
    return new Promise((reslove) => {
      $.ajax({
        url: 'url1', 
        success(res1) {
          $('.input').val(res1)
          reslove()
        }
      })
    })
  })
})

$('.btn2').click(() => {
  promise = promise.then(() => {
    return new Promise((reslove) => {
      $.ajax({
        url: 'url2',
        success(res2) {
          $('.input').val(res2)
          reslove()
        }
      })
    })
  })
})

思路分析:
先定义一个全局的promise对象,并且这个对象的状态为完成状态,然后为按钮1绑定点击事件:

当点击按钮1的时候在promise的then回掉里面执行ajax请求,并重新给promise赋值.然后用同样的方法为按钮2绑定点击事件.

当第一次点击按钮1的时候,promise为完成状态,所以直接执行promise.then方法,并且将promise.then()重新赋值给promise,然后当点击按钮2的时候再次为promise重新赋值为promise.then,这两个操作就相当于每次点击按钮就为promise添加了一个then方法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势。 2.项目介绍...
    55lover阅读 658评论 0 6
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    前端进阶之旅阅读 114,994评论 24 450
  • 【转载】CSDN - 张林blog http://blog.csdn.net/XIAOZHUXMEN/articl...
    竿牍阅读 3,524评论 1 14
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,637评论 0 106
  • 你有没有过感觉无路可走的时候? 我有过。 第一次感觉无路可走的时候,是在中考过后。当自己的成绩离报考的学校十万八千...
    茨粢思阅读 139评论 0 0