【问题标题】:Handling ajax synchronous? [duplicate]处理ajax同步? [复制]
【发布时间】:2018-01-09 02:39:18
【问题描述】:

我有一个通过 ajax 获取数据并做某事的示例。条件是这个函数可以重复使用。可以在任何地方打电话。

<script type="text/javascript">

    function getData(value1,value2){

        $.ajax({
            url: URL,
            data:{
                email:value1,
                age:value2
            },
            async:false,
            dataType: "json",
            type: "get",
            success: function(data){

                var result;

                result = data.result;

                console.log("result:"+result);
            },
            error: function(){
            }
        });
    };

    var data;

    data = getData("email","age");

    console.log("data:"+data);
</script>

当我调用 ajax 时,结果稍后返回,因此数据为空。我尝试使用 async false 但在 ajax 内就可以了。

如何做javascript等待响应不再执行,获取响应然后继续执行。设置超时不是一个好主意,因为它会导致不同服务器上的服务器响应速度和服务器对不同客户端的响应速度问题。

【问题讨论】:

  • Syncrhonous XMLHttpRequest 在主线程上已被弃用,因为它对最终用户的体验产生不利影响 - 与其逃避异步代码,不如学习使用它。注意:在您的代码中,getData 不返回任何内容,这就是 data 未定义的原因
  • var result;移动到getData的顶部...在getData的底部添加return result;
  • 如果您想要一个包含 异步 请求的答案 - 请参阅 stackoverflow.com/questions/14220321/… - 看起来您最初尝试异步请求并诉诸同步,因为您无法获得异步上班

标签: javascript jquery ajax asynchronous synchronization


【解决方案1】:

你可以试试这个:

function getData() {
    $.ajax({
        url: URL,
        ...
        ...
        type: 'GET',
        success : resultData
    })
}

var resultData = function (data) {
    console.log(data);
    // This will be called whenever the data is available
    // So you execute what ever you want to, once data is available
    // initiate function that is dependent on that data ....
}

getData();

注意:永远不要使用async: false,因为它会让所有的下一个 等待执行的代码以及使 ajax 异步化从来都不是一个好主意: false ,试试回调函数方法。它会给你同样的结果 , 没有使 ajax async: false, 它是更好的方法。

【讨论】:

    【解决方案2】:

    你可以在ajax中使用回调

    例如:

        function getData(value1,value2, callback){
    
            $.ajax({
                url: URL,
                data:{
                    email:value1,
                    age:value2
                },
                dataType: "json",
                type: "get",
                success: function(data){
    
                    var result;
    
                    result = data.result;
        callback(result)
                    console.log("result:"+result);
                },
                error: function(){
                }
            });
        };
    
        var data;
    
        data = getData("email","age", function(result){
        console.log("data:"+data);
    });
    

    【讨论】:

    • 那么,为什么要使用同步请求呢?
    • 将 async 设置为 false 意味着您正在调用的语句必须完成,然后才能调用函数中的下一条语句。如果您设置 async: true 则该语句将开始执行,并且无论异步语句是否已完成,都将调用下一条语句。
    • 我了解异步是如何工作的,只是,通过回调,您还不如走整个异步路线。附言data仍然在您的代码中未定义
    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多