Domanda

Ho un problema con il javascript di seguito in cui il $.ajax La chiamata non viene chiamata. Il alert('foo') accade, ma poi la chiamata di dati viene completamente saltata e il callback non viene mai raggiunto (non ottenere mai alert('success!'). Non capisco completamente i callback, ma sembra che dovrebbe funzionare.

Modificare

Ho modificato la sceneggiatura in cui mi trovo attualmente, poiché ho letto in questo modo è una pratica migliore. Tuttavia, posso intervenire authenticate(), si rompe url:[...], ma poi non fa mai la chiamata AJAX. Ho provato a rimuovere il ritorno solo per vedere se questo è il problema, ma sta producendo lo stesso risultato.

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);
            }
        })
    }
});
È stato utile?

Soluzione 2

La soluzione è una miscela di e.preventDefault() e usando un callback nella chiamata Ajax. Il solo utilizzo del callback non ha risolto il problema, ma aggiungendo preventDefault al authenticate Funzione e risoluzione del problema del callback.

La versione finale e funzionante, ora assomiglia a questa:

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

Altri suggerimenti

Usa invece un callback.

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!");
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top