-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(在其他部分)???它不是返回真实的吗?为什么AddCustomer进不去???

4

3 回答 3

0

用你的新测试,checkIfCustomerIsValid是异步的。即使使用 deferred,它也无法直接返回远程调用的结果。

这里最简单的方法是将回调传递给您的checkIfCustomerIsValid函数或从函数返回承诺。当您混合同步和异步测试时,最好将回调传递给checkIfCustomerIsValid.

于 2013-04-05T06:01:29.610 回答
0

你是对的,不存在 checkIfCustomerIsValid 会返回 true 的情况。这是因为您正试图从匿名函数(即 ajax 请求后的回调)返回 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 回答