正在跳过Ajax调用

时间:2013-12-03 14:11:34

标签: javascript jquery ajax requirejs kendo-mobile

我在下面的javascript中遇到问题,其中$.ajax调用未被调用。 alert('foo')确实发生了,但是完全跳过了数据调用并且从未到达回调(永远不会得到alert('success!')。我不完全理解回调,但这似乎应该有效。< / p>

修改

编辑脚本到我目前的位置,因为我读过这种方式是更好的做法。不过,我可以介入authenticate(),它会在url:[...]上中断,但实际上从未实际进行过ajax调用。我试图删除返回只是为了看看是否存在问题,但它产生了相同的结果。

define(["jQuery", "kendo", "modernizr", "app/environment"], function ($, kendo, modernizr, environment) {
    var authenticate = function (username, password) {
        return $.ajax({
            url: environment.apiConnection + '/canlogin?userid=' + username + '&password=' + password,
            type: 'get',
            dataType: 'jsonp'
        });
    }

    var canLogin = function(data) {
        alert('good');
    }

    return {
        viewModel: kendo.observable({
            username: null,
            password: null,
            authenticate: function () {
                var username = this.get('username'),
                    password = this.get('password');

                authenticate(username, password).done(canLogin);
            }
        })
    }
});

2 个答案:

答案 0 :(得分:1)

改为使用回调。

var canLogin = function (username, password, callback) {
    $.ajax({
        async: false,
        url: config.apiConnection + '/canlogin?userid=' + username + '&password=' + password,
        type: 'GET',
        dataType: 'jsonp',
        error: function (x, t, r) {
            alert('Error');
        },
        success: callback
    });

}

// use
canLogin("user","passwd",function( data ){
    alert("Im called on authentication success!");
});

答案 1 :(得分:1)

解决方案是e.preventDefault()的混合,并在ajax调用中使用回调。仅使用回调并未解决问题,但将preventDefault添加到authenticate功能并修复了回调问题。

最终的工作版本现在看起来像这样:

define(["jQuery", "kendo", "modernizr", "app/environment"], function ($, kendo, modernizr, environment) {
    function authenticate(username, password, callback) {
        $.ajax({
            url: environment.apiConnection + '/canlogin?userid=' + username + '&password=' + password,
            type: 'get',
            dataType: 'jsonp',
            success: callback,
            error: function (x,t,r) {
                console.log('error')
            }
        });
    }

    function login(canLogin, username, password) {
        if (canLogin == false) {
            alert('Incorrect username or password');
            return;
        }

        alert('good');
    }

    return {
        viewModel: kendo.observable({
            username: null,
            password: null,
            authenticate: function (e) {
                e.preventDefault();
                var username = this.get('username'),
                    password = this.get('password');

                authenticate(username, password, function (canLogin) {
                    login(canLogin, username, password);
                });
            }
        })
    }
});