2011-10-14 83 views
1

可能重複:
Why is this function returning 「undefined」?爲什麼回報`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()); 
+3

因爲你的'ticket_check()'函數沒有返回任何東西。 –

+0

'get_ticket_code'應該是一個url /文件... – jackJoe

+3

這是因爲你從'success'回調中返回,而不是'ticket_check()'返回。 – JJJ

回答

2

因爲您正在進行異步調用,所以當警報執行時還沒有返回任何東西。

您可以設置異步爲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調用

+0

我在代碼中放了'async:false',但在輸出中仍然是'undefined'。 –

+0

主要功能仍然不會返回任何東西;它保持正在返回的回調。 – pimvdb

2

$就調用是異步的,你不能打電話從它那裏得到一個返回值的ESIT從「成功」功能繼續流動。第一次調用ticket_check時,代碼返回結果不會被執行。

你的函數已經在操縱DOM,你試圖實現什麼?

+0

我在代碼中放了'async:false',但在輸出中仍然是'undefined'。 –

+0

@AliciaCibrian不這樣做。就像Jared Farrish所說的那樣,在成功和錯誤處理程序中做你的行爲。事件編程是一種範式變化,不像調用函數並獲得結果。你要求採取行動,你爲它預定,如果需要,你立即控制回去做其他事情,幾毫秒後,你的ajax會回來併發起一個事件。 – stivlo

0

,因爲你在$.ajax.success事件,這是在一個差的線程運行的返回true(或false)(不是一個真正的胎面,但喜歡它)是異步的。當你結束main方法(作爲主線程)時,沒有任何東西可以返回。通過在ajax調用中設置async:false attr,可以解決問題。更好的方法是創建一個委託來處理結果。

+0

我在代碼中放了'async:false',但在輸出中仍然是'undefined'。 –

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); 
+1

不錯。 jQuery確實有一個['.promise()'](http://api.jquery.com/promise/)內置(不知道它是什麼版本引入)。 –

+0

也許我誤解了它,買你命名爲'complete',但是使用'success'。 – pimvdb

+0

@Jared:哈,這很有趣。我只是誠實地不知道(我最好的猜測是,我們在我目前的項目上推出了自己的項目,然後才被引入,並且從那以後纔開始使用它)。又一例[jQuery做的絕對是一切!](http://philosopherdeveloper.wordpress.com/2011/07/29/does-jquery-turn-programmers-into-babies/);) –