在想问这里之前,我已经搜索了一段时间的答案,但我还是被卡住了。
我读过一些与我类似的文章/问题,但最后还是读了以下一篇:
- JQuery-将ajax响应存储到全局变量//答案:https://stackoverflow.com/a/905324
- jQuery:ajax调用成功后返回数据
我最终得到了这个:
var del_act = (function(){
var resp;
$.post(url+'delete/'+id, 'json')
.done(function(data) {
custom_alert(type.toUpperCase()+' deleted succesfully!');
if(redirect)
window.location.replace(url);
resp = true;
})
.fail(function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
if(jqXHR['status'] == 404)
custom_alert(type + ' not found');
resp = false;
});
return {getResp: function()
{
console.log(resp);
return resp;
}};
})();
console.log(del_act.getResp());
但问题是两个console.log
都返回一个undefined
响应。我知道我可以将$.ajax()
与async: false,
一起使用,但我不想这样做,所以我正在尝试找到一种返回true
或false
响应的方法。
$.post()
是异步的,这意味着它在发送请求后立即返回,并按顺序执行之后的代码。在这种情况下,您的console.log
会被调用,但您的请求是异步运行的,因此您无法获得其返回值。
处理这种异步场景的方法是使用回调,例如,指定returnCallback参数,然后在$.post
调用的"done"回调中调用它。
var del_act = (function(doneCB){
var resp;
$.post(url+'delete/'+id, 'json')
.done(function(data) {
// Call CALLBACK specifying return status
doneCB(true)
})
异步代码的问题是它迫使你在级联回调中做所有事情,例如你不能做:
console.log(del_act(whatever))
因为这将为您提供undefined
,因为如前所述,异步函数仍在单独运行。你必须以不同的方式思考。在这种情况下,您必须进行设置,以便console.log在工作完成后发生:
del_act(function() { console.log("del_act finished, status OK!"); }
相反,您应该做的是在成功/失败中调用一个传递true或false值的函数,然后将代码放入该函数中,以对该true/false输出进行操作
jqXHR
它的self-is和object,并将其直接写入控制台将给出未定义或object作为输出。
从服务器返回的响应似乎是无效的,因为它正在触发失败事件
请确保返回的是有效的JSON数据。
你应该发布一个链接,以便更好地了解这个问题。