页面中有两个ajax按钮,如何用promise解决回调顺序的问题;

页面中有两个按钮,A和B,点击的话分别会发送ajaxA和ajaxB,
有这样的bug,点击A后,没有返回之前,去点击B,返回B,这是A也返回了,容易造成混乱,
这个问题能用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();
                }
            })
                ;
            }
        )
            ;
        }
    )
        ;
    }
    )
    ;
阅读 4.4k
5 个回答

看上去就是声明了一个全局的promise对象,btn.click的时候会用全局对象promisethen执行本来click要做的事情,并更新全部promise。这样你按钮点击就会形成一个promise链,应该能解决你的问题。

我用setTimeout模拟异步、试一下这段代码

var test ={
    func1:function(){
        var data = new Promise(function(resolve){
            setTimeout(function(){
                resolve("ajax结果111")
            },300)
        })
        return data;
    },
    func2:function(){
        var data = new Promise(function(resolve){
            setTimeout(function(){
                resolve("ajax结果222")
            },100)
        })
        return data;
    },
    func3:function(){
        var data = new Promise(function(resolve){
            setTimeout(function(){
                resolve("ajax结果333")
            },500)
        })
        return data;
    }
}
test.func1().then(test.func2).then(test.func3).then(function(value){
    console.log(value)
})

三个ajax延时不同、顺序执行

可以用RxJs,虽然以前也没用过,但在知乎看见类似问题的时候查了一下,感觉很符合这个需求。而且更容易扩展,防止ajax请求出错,时间过长对程序的影响

promise的话没怎么用过,直接想到了aynsc,await,正在尝试...

不知道你要的是不是点击两个按钮,只需要最先返回的那个的结果,如果是这样的话可以试试
Promise.race()

你可以理解为逐一向 promise 里面添加步骤。

promise 是按顺序执行的,每一个 then 在执行完之后才会执行后面的 then

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题