为什么返回是'undefined`

时间:2011-10-14 16:09:08

标签: javascript jquery

  

可能重复:
  Why is this function returning “undefined”?

为什么以下代码返回undefined以防返回应为true?我该怎么办?

<input type="text" value="" class="ticket_code">

function ticket_check() {
    var val = 'ticket_code=' + $('.ticket_code').val();
    var input_val = $('.ticket_code').val();
    $.ajax({
        type: "POST",
        url: 'get_ticket_code',
        data: val,
        cache: false,
        success: function (data) {
            var result = true;
            if (data != 0) {
                $('div').empty().hide().fadeIn('slow').append(data + '<input name="name_ticket_code" value="' + data + '" style="display: none;">');
            } else {
                if (input_val) {
                    $('div').fadeOut('slow', function () {
                        $(this).empty();
                    })
                    result = false;
                }
            }
            return result
        }
    });
}

alert(ticket_check());

4 个答案:

答案 0 :(得分:2)

因为您正在进行异步调用,所以当执行警报时,尚未返回任何内容。

您可以将async设置为false

   $.ajax({
        type: "POST",
        url: 'get_ticket_code',
        data: val,
        async: false,
        cache: false,
        success: function (data) {
            var result = true;
            if (data != 0) {
                $('div').empty().hide().fadeIn('slow').append(data + '<input name="name_ticket_code" value="' + data + '" style="display: none;">');
            } else {
                if (input_val) {
                    $('div').fadeOut('slow', function () {
                        $(this).empty();
                    })
                    result = false;
                }
            }
            return result
        }
    });

但这会锁定浏览器。

更好的方法是根据ajax调用的esit继续“成功”函数的流程

答案 1 :(得分:2)

$ .ajax调用是异步的,你无法调用并从中获取返回值。首次调用ticket_check时,不会执行代码返回结果。

你的功能已经在操纵DOM,你想要实现什么?

答案 2 :(得分:1)

以下是实现目标的常用方法:创建某种“承诺”对象,该对象将由ticket_check()返回:

function Promise() {
    var callback = function() {};

    this.onResult = function(result) {
        callback(result);
    }

    this.complete = function(handler) {
        callback = handler;
        return this;
    }
}

function ticket_check() {
    var promise = new Promise();

    // ...
    $.ajax({
        // ...
        success: function (data) {
            var result = true;
            // ...
            promise.onResult(result);
        }
    });

    return promise;
}

这允许您调用这样的代码:

ticket_check()
    .complete(window.alert);

答案 3 :(得分:0)

因为您在true事件中返回false(或$.ajax.success),该事件在差异线程中运行(不是真正的步骤,而是像它一样)异步运行。当你结束main方法(作为主线程)时,没有什么可以返回的。通过在ajax调用中设置async:false attr,您可以解决问题。更好的方法是创建一个委托来处理结果。