我的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();
});
所以 - 首先当#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');
}
});
}
现在 - 问题是 - 我不知道使用“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');
}
});
}
然后是updateResult()函数:
function updateResult(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();
});
但由于某种原因 - 它不起作用 - 任何想法?
答案 0 :(得分:101)
麻烦的是你不能从异步调用中返回一个值,比如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');
}
});
}
另一种可能性(实际上是相同的)是在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
}
答案 1 :(得分:29)
有很多方法可以获得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);
});
第二名:
使用 $ .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);
你可以把它做得尽可能大......
答案 2 :(得分: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;
}
希望帮助某人
阿纳
答案 3 :(得分:3)
将async: false
添加到您的属性列表中。这会强制javascript线程等到检索返回值后再继续。显然,你不希望在任何情况下都这样做,但如果在继续之前需要一个值,那就可以了。
答案 4 :(得分:2)
这是相当陈旧,丑陋,不要这样做。您应该使用回调:https://stackoverflow.com/a/5316755/591257
有同样的问题,用这种方式解决,使用全局变量。不确定它是否是最好的但肯定有效。如果出错,您会得到一个空字符串(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;
}
答案 5 :(得分:2)
// Common ajax caller
function AjaxCall(url,successfunction){
var targetUrl=url;
$.ajax({
'url': targetUrl,
'type': 'GET',
'dataType': 'json',
'success': successfunction,
'error': function() {
alert("error");
}
});
}
// Calling Ajax
$(document).ready(function() {
AjaxCall("productData.txt",ajaxSuccessFunction);
});
// Function details of success function
function ajaxSuccessFunction(d){
alert(d.Pioneer.Product[0].category);
}
它可能会有所帮助,创建一个通用的ajax调用函数并附加一个在ajax调用成功时调用的函数,参见示例
答案 6 :(得分:0)
尽管由于弃用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;
}
});
}
致电上述内容:
getAjax(youUrl, yourData).done(function(response){
console.log(response);
});
用于$.when
的多个AJAX调用:
$.when( getAjax(youUrl, yourData), getAjax2(yourUrl2, yourData2) ).done(function(response){
console.log(response);
});
2nd:将响应存储在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);
注意::在jquery cookies
库上方的示例中使用了库。它很轻巧,可以很灵活地工作。这是链接https://github.com/js-cookie/js-cookie
答案 7 :(得分:0)
在here的帮助下
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;
}
希望这会对某人有所帮助。
答案 8 :(得分:-2)
您在ajax调用中尝试 async:false ..