在考虑问这个问题之前,我一直在寻找答案,但我只是被卡住了。
我已经阅读了一些类似于我的文章/问题,但结束了以下这些:
我最终得到了这个:
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
响应。
答案 0 :(得分:3)
$.post()
是异步的,这意味着它在发送请求后立即返回,并且在它之后的代码按顺序执行。在这种情况下,您的console.log
会被调用,但您的请求是异步运行的,因此您无法获得其返回值。
处理这种异步场景的方法是使用回调,例如。您指定了returnCallback参数,并在$.post
来电的“完成”回调中调用它。
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
,因为如前所述,async函数仍然是单独运行的。你必须以不同的方式思考。在这种情况下,您必须进行设置,以便在完成工作后发生console.log:
del_act(function() { console.log("del_act finished, status OK!"); }
答案 1 :(得分:1)
变量不能像那样转移出ajax调用。
相反,你应该做的是在成功/失败中调用一个函数,该函数传递true或false的值,然后将代码放在函数内以对该真/假输出进行操作
答案 2 :(得分:-1)
jqXHR
它的自身是和对象并直接向控制台写入会给出undefined或object作为输出。
似乎从服务器返回的响应无效,因为它触发了失败事件
确保您返回有效的 JSON 数据。
你应该发布一个链接,以便更好地查看问题。