Pergunta

Estou tendo um problema com o javascript abaixo em que o $.ajax A chamada não está sendo chamada. o alert('foo') acontece, mas a chamada de dados é completamente ignorada e o retorno de chamada nunca é alcançado (nunca obtenha alert('success!'). Não entendo completamente os retornos de chamada, mas isso parece estar funcionando.

Editar

Editei o script para onde eu estou atualmente, pois li dessa maneira é uma prática melhor. Ainda assim, eu posso intervir para authenticate(), ele quebra url:[...], mas nunca realmente faz a chamada do Ajax. Tentei remover o retorno apenas para ver se esse é o problema, mas está produzindo o mesmo resultado.

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);
            }
        })
    }
});
Foi útil?

Solução 2

A solução é uma mistura de e.preventDefault() e usando um retorno de chamada na chamada AJAX. Apenas usar o retorno de chamada não resolveu o problema, mas adicionando preventDefault para o authenticate função e corrigindo o problema de retorno de chamada.

A versão final, funcionando, agora se parece com o seguinte:

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);
                });
            }
        })
    }
});

Outras dicas

Use um retorno de chamada.

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!");
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top