0

私のページにフォームがあります。ユーザーが [送信] ボタンを押すと、バックグラウンドで、この番号を生成する関数を呼び出して unique_number も生成し、この番号が存在しないことを DB でチェックします。存在する場合 - 再度生成し、そうでない場合 - この番号を返します。ただし、何らかの理由で、この番号をページに出力したり、警告したりしようとすると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;
        }
    });
}

true の場合は結果を取得します。false の場合は新しい番号を生成し、返される必要があります。alert私はその部分の数字を試してみましたelseが、番号を警告しましたが、戻り時に-未定義です。なぜそれが起こっているのか、それを修正する方法は?

4

1 に答える 1

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 を利用できないため、これはテストされていませんが、理論的には、呼び出しresultが同じ関数への再帰呼び出しの結果を返すというものです。である場合、選択した数値を新しい promise の (解決された) 結果として返します。true.thenresultfalse

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は、元の呼び出しと同じ「呼び出しスタック」レベルになります。

また、コメントで指摘されているように、サーバーに乱数を与える方が実際にははるかに簡単です。

于 2013-06-13T09:11:16.007 に答える