Вопрос

У меня проблема с JavaScript ниже, в котором $.ajax звонок не называется. А alert('foo') случается, но тогда звонок данных полностью пропущен, и обратный вызов никогда не достигается (никогда не получайте alert('success!'). Анкет Я не совсем понимаю обратные вызовы, но, похоже, это должно работать.

Редактировать

Отредактировал сценарий туда, где я сейчас стою, так как я прочитал этот путь, - это лучшая практика. Тем не менее, я могу войти в 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

Раствор представляет собой смесь 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);
                });
            }
        })
    }
});

Другие советы

Вместо этого используйте обратный вызов.

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!");
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top