javascript - 页面中有两个ajax按钮,如何用promise解决回调顺序的问题;
ringa_lee
ringa_lee 2017-04-11 12:04:50
[JavaScript讨论组]

页面中有两个按钮,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();
                }
            })
                ;
            }
        )
            ;
        }
    )
        ;
    }
    )
    ;
ringa_lee
ringa_lee

ringa_lee

全部回复(5)
阿神

我用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延时不同、顺序执行
大家讲道理

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

迷茫

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

  • 知乎中的类似问题

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

PHP中文网

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

PHP中文网

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号