2013-06-13 262 views
0

我的頁面上有一個表單。當用戶點擊發送按鈕時,它在後臺也會通過調用一個產生這個數字的函數來產生一個unique_number,並在數據庫中檢查這個數字不存在;如果它確實 - 再次生成它,如果不是 - 返回這個數字。但是,由於某種原因,當我試圖將這個數字打印出來,或者提醒它 - 我得到undefined,雖然函數返回數字。 這裏的調用該函數:調用函數返回'undefined'

var unique_num = create_unique_number(); 
alert(unique_num); 
    rest of this function... 

而這裏的函數本身:

function create_unique_number() 
{ 
var num = Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; 

$.getJSON("inc/API.php", 
{ 
    command:"is_unique_number_exist", 
    unique_num:num 
}, 
    function(result){ 
     if(result==true){ 
      create_unique_number(); 
     } 
     else 
     { 
      return num; 
     } 
    }); 
} 

我得到的結果,如果這是真的 - 它會產生新的號碼,如果假 - 應該返回。我試圖alertelse部分中的數字,它確實警告數字,但在返回 - 未定義。 爲什麼會發生,以及如何解決它?

+0

只有getJson的回調函數返回num,create_unique_number函數中沒有返回值。 –

+3

請注意,服務器端選擇一個唯一的號碼會更快。使用較少的網絡,服務器上的工作量相似。 – Liosan

+0

希望這個網站有一個「撤回近距離投票」選項 - 這個功能的遞歸部分使解決方案相當,呃,有趣... – Alnitak

回答

1

對於使用延遲對象的解決方案,試試這個:

function create_unique_number() 
{ 
    var num = Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; 

    return $.getJSON("inc/API.php", { 
     command:"is_unique_number_exist", 
     unique_num:num 
    }).then(function(result) { 
     return result ? create_unique_number() : num; 
    }); 
} 

當然,這是未經檢驗的,因爲我沒有你提供的API做,但理論是,如果resulttrue.then通話將遞歸調用的結果返回給同一個函數。如果resultfalse,那麼它將返回所選號碼作爲新諾言的(解析)結果。

如果任何AJAX調用失敗,循環應該打破,你可以捕獲與一個.fail電話:

create_unique_number().done(function(n) { 
    // use your unique number "n" here 
    var unique_num = n; 
    ... 
}).fail(function() { 
    // there was an AJAX error 
}); 

// can't use "unique_num" here - execution continues here immediately 
// and "unique_num" isn't defined until the above ".done" callback is 
// invoked some time later 

注意遞歸調用是不是真正遞歸 - 因爲AJAX是事件驅動的,在AJAX .then事件觸發之前,原始函數已經終止並清理了堆棧。由此產生的create_unique_number的新呼叫將與原始呼叫處於相同的「呼叫棧」級別。

此外,正如在評論中指出的那樣,讓服務器給你一個隨機數實際上會簡單得多。

+0

試圖按照你的答案,但我猜想我做錯了 - 我現在正在返回一個'[object Object]'...我的API很簡單:它調用文件BusinessLogic.php中的一個函數:if(is_unique_number_exist($ _ REQUEST [「unique_num」])) echo json_encode(true); else echo json_encode(false);'如果存在則從存在數字的數據庫中選擇原始數據。 't - False:'{$ arr = select(「SELECT * FROM tbl WHERE unique_num ='$ num'」); return(count($ arr)> 0);}'不知道如何讓服務器給我一個只有6個數字的隨機數。 PHP提供13個字符,數字和字母。 – Igal

+0

@Igal是''[object object]'create_unique_number'的返回值(這就是我所期望的)或'n'的值傳遞給每個最終代碼示例的'.done'回調? – Alnitak

+0

是的,這是返回值。 – Igal