2016-08-27 31 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のオブジェクトや匿名関数のユーザーについては熟知していません。誰もこのことがうまくいかない理由を説明してもらえますか?それはOKであるべきである十分なリターンが各ターンにあるようである。

SOLUTION

これには、非同期の問題である:

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 - ええ、私はそれを見ました、ジェームスSpaderはそれで素晴らしかった –

答えて

2

3つの理由があります。動作しませんHY:isPasswordProtectedが情報を得るためにそれを使用している場合、それが戻ったとき、それは持っていないとして、それは、フラグを返すことはできませんので

  1. $.postは、デフォルトで非同期です結果はまだありません。詳細は、How do I return the response from an asynchronous call?を参照してください。 $.postは(それがオプションであることができるが、それは悪い考えです)、同期した、$.postは、そのコールバックの戻り値のいずれかを使用しませんので、そのコールバックでのごreturn」はdoesnの場合でも

  2. 何もしない。

  3. $.postは、それが同期した場合には(そうでない)コールバックの結果を返すようにしたとしても、isPasswordProtectedは戻り値を設定したことがない(そのコードに、isPasswordProtectedからのreturnのみ、コールバックから、ありません〜$.post)。

上記のリンクはまた、その性質によってreturn Sで問題を解決し、非同期の問題に対処するためにgetPPStatusisPasswordProtectedを変更する方法について説明します。

+0

Gargh、再び非同期!私はすぐに私の最初の記事に私のソリューションを編集します...ありがとう! –

+1

@AlexanderBunting:それをする必要はありません。上記のおかげでうれしい! –