jquery - 使用ajax结果返回值成功

use*_*341 87 jquery

我有一个jquery $ .ajax()函数的小问题.

我有一个表单,每次单击单选按钮或从下拉菜单中选择创建一个具有所选值的会话变量.

现在 - 我有一个下拉菜单有4个选项 - 第一个(标签为None)有一个值=""其他有其ID.

我想要发生的是无选项(带空白值)删除会话而其他选项创建一个,但仅当具有此特定选择名称的会话尚不存在时 - 因为所有其他选项都分配了相同的金额 - 它只是表明选择了哪一个.

我不确定这是否有意义 - 但看看代码 - 也许这会让它更清晰:

$("#add_ons select").change(function() {
        // get current price of the addons
        var order_price_addon = $(".order_price_addon").text();
        // get price of the clicked radio button from the rel attribute
        var add = $(this).children('option').attr('label');
        var name = $(this).attr('name');
        var val = $(this).val();


        if(val == "") {
            var price = parseInt(order_price_addon) - parseInt(add);
            removeSession(name);
        } else {
            if(isSession(name) == 0) {
                var price = parseInt(order_price_addon) + parseInt(add);
            }   
            setSession(name, val);              
        }

        $(".order_price_addon").html(price);    
        setSession('order_price_addon', price);         
        updateTotal();
});
Run Code Online (Sandbox Code Playgroud)

所以 - 首先当#add_ons选择菜单触发"更改"时,我们从一些元素中获取一些值用于计算.

我们从select中获取选项的label属性,该属性存储要添加到total的值,select的名称以创建具有此名称和值的会话,以便稍后检查选择了哪一个.

现在 - 我们检查是否val ==""(表示已选择无选项),我们从总数中扣除金额,并删除具有选择名称的会话.

在这之后问题开始 - 否则声明.

否则 - 我们要检查带有我们的选择器名称的isSession()函数是返回0还是1 - 如果它返回0,那么我们将总和存储在label属性中的值加上,但是如果它返回1 - 这表明该会话已存在 - 然后我们只通过重新创建它来更改此会话的值 - 但不会将该数量添加到该会话中.

现在isSession函数看起来像这样:

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
            return data;
        },
        error: function() {
            alert('Error occured');
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在 - 问题是 - 我不知道使用"return"是否会返回函数的结果 - 因为它似乎不起作用 - 但是,如果我把"数据"放入成功:部分进入警报 - 它确实似乎返回正确的值.

有谁知道如何从函数中返回值,然后在下一个语句中进行比较?


谢谢你们 - 我已经通过以下方式尝试了它:

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
            updateResult(data);
        },
        error: function() {
            alert('Error occured');
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

然后是updateResult()函数:

function updateResult(data){result = data; }

结果 - 是全局变量 - 我正在尝试阅读:

$("#add_ons select").change(function() {
        // get current price of the addons
        var order_price_addon = $(".order_price_addon").text();
        // get price of the clicked radio button from the rel attribute
        var add = $(this).children('option').attr('label');
        var name = $(this).attr('name');
        var val = $(this).val();


        if(val == "") {
            var price = parseInt(order_price_addon) - parseInt(add);
            removeSession(name);
        } else {
            isSession(name);
            if(result == 0) {
                var price = parseInt(order_price_addon) + parseInt(add);
            }   
            setSession(name, val);              
        }

        $(".order_price_addon").html(price);    
        setSession('order_price_addon', price);         
        updateTotal();
    });
Run Code Online (Sandbox Code Playgroud)

但由于某种原因 - 它不起作用 - 任何想法?

use*_*716 104

麻烦的是你不能从异步调用中返回一个值,比如AJAX请求,并期望它能够工作.

原因是等待响应的代码已经在收到响应时执行.

这个问题的解决方案是运行所需的代码success:回调.这样它data只有在可用时才访问它.

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
            // Run the code here that needs
            //    to access the data returned
            return data;
        },
        error: function() {
            alert('Error occured');
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

另一种可能性(实际上是相同的)是在success:回调中调用一个函数,该函数在可用时传递数据.

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
                // Call this function on success
            someFunction( data );
            return data;
        },
        error: function() {
            alert('Error occured');
        }
    });
}

function someFunction( data ) {
    // Do something with your data
}
Run Code Online (Sandbox Code Playgroud)

  • "非异步"当然也可以称为"同步";) (45认同)
  • 您可以从AJAX请求中返回一个值,但这只有在您使*非异步*时(设置选项`async:false`).在某些情况下,不需要进行异步调用.更多关于jquery.ajax()doc http://api.jquery.com/jQuery.ajax/,而不是"从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);" (11认同)

Nee*_*ngh 30

有很多方法可以获得jQuery AJAX响应.我将与您分享两种常见方法:

第一:

使用async = false并在函数内返回ajax-object,然后获取响应ajax-object.responseText

/**
 * jQuery ajax method with async = false, to return response
 * @param  {mix}  selector - your selector
 * @return {mix}           - your ajax response/error
 */
function isSession(selector) {
    return $.ajax({
        type: "POST",
        url: '/order.html',
        data: {
            issession: 1,
            selector: selector
        },
        dataType: "html",
        async: !1,
        error: function() {
            alert("Error occured")
        }
    });
}
// global param
var selector = !0;
// get return ajax object
var ajaxObj = isSession(selector);
// store ajax response in var
var ajaxResponse = ajaxObj.responseText;
// check ajax response
console.log(ajaxResponse);
// your ajax callback function for success
ajaxObj.success(function(response) {
    alert(response);
});
Run Code Online (Sandbox Code Playgroud)

第二:

使用$ .extend 方法并创建一个像ajax的新函数

/**
 * xResponse function
 *
 * xResponse method is made to return jQuery ajax response
 * 
 * @param  {string} url   [your url or file]
 * @param  {object} your ajax param
 * @return {mix}       [ajax response]
 */
$.extend({
    xResponse: function(url, data) {
        // local var
        var theResponse = null;
        // jQuery ajax
        $.ajax({
            url: url,
            type: 'POST',
            data: data,
            dataType: "html",
            async: false,
            success: function(respText) {
                theResponse = respText;
            }
        });
        // Return the response text
        return theResponse;
    }
});

// set ajax response in var
var xData = $.xResponse('temp.html', {issession: 1,selector: true});

// see response in console
console.log(xData);
Run Code Online (Sandbox Code Playgroud)

你可以把它做成你想要的那么大......

  • 从jQuery 1.8开始,不推荐使用async:false! (7认同)

aes*_*ede 8

编辑:这很旧,而且丑陋,不要这样做。您应该使用回调:/sf/answers/372172881/

编辑2: 查看获取API

有同样的问题,使用全局变量以这种方式解决。不确定它是否是最好的,但肯定有效。出错时,您会得到一个空字符串 (myVar = ''),因此您可以根据需要进行处理。

var myVar = '';
function isSession(selector) {
  $.ajax({
    'type': 'POST',
    'url': '/order.html',
    'data': {
      'issession': 1,
      'selector': selector
    },
    'dataType': 'html',
    'success': function(data) {
      myVar = data;
    },
    'error': function() {
      alert('Error occured');
    }
  });
  return myVar;
}
Run Code Online (Sandbox Code Playgroud)

  • 你还需要在这里添加 async: false ,因为在异步模式下,不能保证在返回 myVar 之前将 data 保存到 myVar 中。 (9认同)

小智 8

我在这里看到了答案,虽然很有帮助,但由于我不得不改变我的许多代码,因此它们并不完全是我想要的.

对我有用的是,做了这样的事情:

function isSession(selector) {
    //line added for the var that will have the result
    var result = false;
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        //line added to get ajax response in sync
        async: false,
        success: function(data) {
            //line added to save ajax response in var result
            result = data;
        },
        error: function() {
            alert('Error occured');
        }
    });
    //line added to return ajax response
    return result;
}
Run Code Online (Sandbox Code Playgroud)

希望帮助某人

阿纳金

  • 你实际上只是关闭异步 (4认同)

MR_*_*DEV 8

虽然所有关于使用的async: false方法都不好,因为它被弃用了,并且在请求回来之前卡住了页面。因此,这里有两种方法可以做到:

第一:在一个函数中返回整个ajax响应,然后done在请求完成时使用函数来捕获响应。(推荐,最好的方法)

function getAjax(url, data){
    return $.ajax({
        type: 'POST',
        url : url,              
        data: data,
        dataType: 'JSON',
        //async: true,  //NOT NEEDED
        success: function(response) {
            //Data = response;
        }
    });
 }
Run Code Online (Sandbox Code Playgroud)

像这样调用上面的:

getAjax(youUrl, yourData).done(function(response){
    console.log(response);
});
Run Code Online (Sandbox Code Playgroud)

对于多个 AJAX 调用,请使用$.when

$.when( getAjax(youUrl, yourData), getAjax2(yourUrl2, yourData2) ).done(function(response){
    console.log(response);
});
Run Code Online (Sandbox Code Playgroud)

第二:将响应存储在 cookie 中,然后在 ajax 调用之外获取该 cookie 值。(不推荐)

        $.ajax({
            type: 'POST',
            url : url,              
            data: data,
            //async: false,    // No need to use this
            success: function(response) {
                Cookies.set(name, response);
            }
        });

        // Outside of the ajax call
        var response = Cookies.get(name);
Run Code Online (Sandbox Code Playgroud)

注意:在上面的例子中使用了jquery cookies库。它非常轻巧,工作起来很活泼。这是链接https://github.com/js-cookie/js-cookie


小智 8

有了这里的帮助

function get_result(some_value) {
   var ret_val = {};
   $.ajax({
       url: '/some/url/to/fetch/from',
       type: 'GET',
       data: {'some_key': some_value},
       async: false,
       dataType: 'json'
   }).done(function (response) {
       ret_val = response;
   }).fail(function (jqXHR, textStatus, errorThrown) {
           ret_val = null;
       });
   return ret_val;
}
Run Code Online (Sandbox Code Playgroud)

希望这对某人有所帮助。