javascript - ajax异步请求,同步等待如何做?
天蓬老师
天蓬老师 2017-04-11 11:59:06
[JavaScript讨论组]

作用描述:写了一个搜索框,用户输入关键字后,下面框给出联想词(一般电商网站顶部的搜索框)。

js代码

$('input').keyup(function(){
   var kw = $('input').val();
   querySUG(kw);

})

ajax代码

$.ajax({
   //省略
   success:function(data){
           var data = data;//data从其他网站的接口传过来的json
       
           $.each(data,function(i,element)){
              $('
    ').append($('
  • element
  • ')) } $('
  • ').click(chooseKeyword);//这一步简化了,是再循环每个li,添加点击事件,如果选择联想词再执行一些操作 } }) function chooseKeyword(){ //省略 }

    问题来了

    1. 其实我ajax只想获取数据,动态生成ul,li标签,我是不想放在ajax的回调函数里的。

    2. chooseKeyword这个函数执行,我也不想放在回调函数里
      但其实,我ajax只想获取数据而已,不想把其他的都放在回调函数里,但后续的操作都是要等ajax请求完后才能操作,比如动态生成标签li,添加点击事件等


    所以就是我说的‘异步请求,同步等待’:能不能有方法/函数,是等ajax异步请求后,再执行的函数,,或者是有更好的方法,麻烦大神指点一下,谢谢!

    天蓬老师
    天蓬老师

    欢迎选择我的课程,让我们一起见证您的进步~~

    全部回复(5)
    PHPz

    最好的办法就是在回调函数里写。
    当然逻辑都写到回调函数里肯定不优雅,所以es7推出了 async await关键字,配合promise就可以以同步的方法写异步,浏览器上可以用babel编译为es5,模拟async await。

    或者直接把异步请求改成同步,当然这样会阻塞整个js线程,网页会卡。

    async await和promise的使用很简单,你只需要在请求的地方使用await,然后在包含了await的函数前加上async就可以了,示例如下

    async function req(){
         await fetch("www.baidu.com");
         //业务代码
    }
    

    Jquery 异步改同步需要直接调用$.ajax函数,如

    $.ajax('www.baidu.com', {
        method: 'get',
        async: false
    })
    //业务代码
    黄舟

    你这个问题有点矛盾啊,显然你要等待数据准备好才能进行接下来的操作,而回调函数是解决这种异步问题的一个方法。

    当然如果想写法上更加符合同步的写法,可以试试promise,jquery也有相关的实现,就是defered对象。

    或者使用es6的Promise对象,es7的async,await。

    这些都是当前js为解决异步编程只依赖回调所做的努力。

    高洛峰

    你用jquery的话那么可以使用$.deferred或者$.when这样的API.它的作用就是将你的callback的形式铺平开来,可以使用链式写法,看起来像同步执行的。但是你发起请求仍然是异步的。

    巴扎黑

    Promise对象就是为了解决异步回调嵌套大法的、可以去看一下

    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)
    })
    
    //几个异步方法是依次执行的
    高洛峰

    使用promise

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

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