0

在想在这里问之前,我一直在寻找答案,但我只是卡住了。

我已经阅读了一些与我类似的文章/问题,但以这些文章结尾:

我最终得到了这个:

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.logs 都返回undefined响应。我知道我可以使用$.ajax()withasync: false,但我不想,所以我试图找到一种返回 atruefalse响应的方法。

4

3 回答 3

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!"); }
于 2013-02-26T13:42:53.743 回答
1

变量不能像那样从 ajax 调用中转移出来。

相反,您应该做的是在成功/失败中调用一个传递 true 或 false 值的函数,然后将代码放入函数中以对该 true/false 输出进行操作

于 2013-02-26T13:39:22.303 回答
-1
jqXHR

它的自我是和对象,并且直接将其写入控制台会给出未定义或对象作为输出。
似乎从服务器返回的响应无效,因为它触发了失败事件。
确保您返回有效的JSON数据。

您应该发布一个链接以便更好地了解问题。

于 2013-02-26T13:42:14.580 回答