-1

私はこのコードを持っています..

if (!checkIfCustomerIsValid(event)) {
        event.preventDefault();
        return false;
    }
else {
   AddCustomer();
}

function checkIfCustomerIsValid(event) {
    if ($('#txtCName').val() == '') {
        alert('Please enter a valid value for customer name!');
        return false;
    }
    if ($('#txtCAddress').val() == '') {
        alert('Please enter a valid value for customer address!');
        return false;
    }

}

それまでは問題なく返されましたが、新しいチェックを追加しましたが、何も返されませんでした。

function checkIfCustomerIsValid(event) {

  // code that was already there, the name and address check

  var _mobNo;
    if ($('#txtMobile').val() == '') return false;

    var _unq = $.ajax({
        url: '../Autocomplete.asmx/IsMobileUnique',
        type: 'GET',
        contentType: 'application/json; charset=utf8',
        dataType: 'JSON',
        data: "mobileNo='" + $('#txtMobile').val() + "'",
        async: false,
        timeout: 2000,
        success: function (res) { if (res.d) return false; else return true; },
        error: function (res) { alert('some error occurred when checking mobile no'); }
    }),chained = _unq.then(function (data) { if (data.d == false) { alert('mobile no already exists!'); $('#txtMobile').focus(); return false; } return true; });

}

モバイル番号が一意でない場合、アラートはモバイル番号が一意ではないことを示しますが、一意の場合、コードはAddCustomer(else 部分で) 入りませんか??? true を返していませんか?なぜ入っていないのですAddCustomerか???

4

3 に答える 3

0

そうです、checkIfCustomerIsValid が true を返すシナリオはありません。これは、無名関数 (つまり、ajax 要求の後のコールバック) から true を返そうとしているためです。からtrueを返すと

    chained = _unq.then(function (data) { if (data.d == false) { alert('mobile no already exists!'); $('#txtMobile').focus(); return false; } return true; });

checkIfCustomerIsValid からではなく、その匿名関数からのみ返されます。この問題を解決することは完全に簡単ではなく、非同期呼び出しの性質から生じる問題です。これに対する最も一般的な解決策は、非同期呼び出しにコールバックを渡すことです。これを実装するフィドルを次に示します。

http://jsfiddle.net/p3PAs/

于 2013-04-05T06:04:52.140 に答える
0

Ajax は非同期であり、ブロックしないため、戻り値はおそらく未定義です。コードを次のように変更できます。

success: function (res) { if (res.d) callRoutineToAddCustomer(); },
于 2013-04-05T06:06:48.020 に答える