2016-08-27 2 views
1

У меня есть этот код ниже.Функции, функции и анонимные функции

var user = new user(); 

function user() { 

    // returns true if the account is password protected 
    function isPasswordProtected(data, callback) { 
     //check if the account is a password protected account, and if so request the password. 
     $.post('user_functions/ifpasswordprot.php', {uid: data['uid']}, function(data) { return callback(data);}); 
    } 

    // function that returns 1 if the user is password protected 
    this.getPPStatus = function() { return isPasswordProtected({uid: this.userid}, function(data) { return data; }); }; 

} 

Это предназначено для создания магазина пользовательского объекта, на который можно ссылаться из другого места на сайте. Для этого есть нечто большее, чем это, но это код, имеющий значение здесь.

С другой страницы Я пытаюсь выяснить, если пользователь, который вошел в защищал свой счет с помощью пароля, так как при этом:

alert(user.getPPStatus()); 

Однако это всегда выходит как undefined.

Я не эксперт по объектам в JavaScript, ни от пользователя анонимных функций. Может кто-нибудь объяснить, почему это не сработает? Кажется, что на каждом обороте достаточно возвратов, чтобы все было в порядке.

РЕШЕНИЕ

Это проблема асинхронной, так:

var user = new user(); 

function user() { 
    // returns true if the account is password protected 
    function isPasswordProtected(data, callback) { 
    //check if the account is a password protected account, and if so request the password. 
    $.post('function/get-ifpasswordprotected.php', {uid: data['uid']}, function(data) { callback(data);}); 
} 

    // function that returns 1 if the user is password protected 
    this.getPPStatus = function(**callback**) { isPasswordProtected({uid: this.userid}, **callback**); }; 

} 

, а затем

user.getPPStatus(function(result) { 
    **DO STUFF HERE** 
}); 

абсолютно понятия не имею, если это хорошо Javascript или нет, но эй, это работает ... :)

+1

Название вопроса звучит как название книги/фильма! – undefined

+1

@Vohuman - да, я видел это, Джеймс Спейдер был отличным в нем –

ответ

2

Существует три причины w гип, что не будет работать:

  1. $.post является асинхронным по умолчанию, так что если isPasswordProtected использует его, чтобы получить информацию, она не может возврата флаг, а когда он возвращается не имеет результат пока. См. How do I return the response from an asynchronous call?.

  2. Даже если $.post были синхронны (что это может быть с возможностью, но это плохая идея), $.post не делает любое использование возвращаемого значения его обратного вызова, так что ваши return в этой функции обратного вызова Безразлично» ничего не делай.

  3. Даже если$.post были возвращать результат обратного вызова, если это были синхронны (она не делает), isPasswordProtected никогда не задает возвращаемое значение (в этом коде, нет return от isPasswordProtected, только от обратного вызова до $.post).

Ссылка выше объясняет, как изменить getPPStatus и isPasswordProtected для решения проблемы асинхронной, который также по своей природе решает проблему с return с.

+0

Gargh, Async снова! В ближайшее время я отредактирую свое решение в своем первом сообщении ... Спасибо! –

+1

@AlexanderBunting: Не нужно это делать. Рад, что это помогло! –

Смежные вопросы