オブジェクト内のオブジェクト

var UsersMenu = function(){
    this.returnUsers = [];
    this.retrieve = function(posts){
        var temp = [];
        $.post("router.php", { "action": "getUsersMenu", "posts" : posts},
        function(data)
        {
            if(data.response){    
                for(var i=0; i

2つの質問:
1. jqオブジェクト(returnUsers)からparent 'this'にアクセスする方法
2. jq postがjq postの警告の前に呼び出しているのはなぜですか?

5
大丈夫です、私は検索に関するルールを知っていますが、それは急いでいるので、私はあなたにもう一度質問しました
追加された 著者 Abyss,
両方の質問がこのサイトで何度も重複している場合は、検索すると両方の回答が見つかるかもしれません(とにかく両方とも別の質問として尋ねられるべきです)。
追加された 著者 Andy E,

5 答え

1 jqオブジェクト(returnUsers)からparent 'this'にアクセスするには?

あなたはクロージャーでそれをキャプチャすることができます:

var UsersMenu = function() {
    this.returnUsers = [];
    var self = this;
    this.retrieve = function(posts) {
        var temp = [];
        $.post("router.php", { "action": "getUsersMenu", "posts" : posts },
        function(data) {
            if(data.response) {
                for(var i = 0; i < data.returnUsers.length; i++) {
                    temp.push(data.returnUsers[i]);
                }
                self.returnUsers = temp;
            }
        }, "json");
    }
};

2 jq postがjq postの警告の前に呼び出しているのはなぜですか?

AJAXは非同期であるためです。 AJAXリクエストを送信する $。post メソッドは直ちに戻りますが、成功コールバックハンドラは、サーバから応答を受け取ったときにはるか後で実行されます。だから、この成功のハンドラの外に警告を出すべきではありません。 AJAX呼び出しの結果を消費したい場合は、結果が得られたコールバック内でのみ発生します。

5
追加された
ありがとう、おいおい。
追加された 著者 Abyss,

あなたの2番目の質問に最初に答えるには、 $。post()関数が非同期 Ajaxリクエストを開始します。これは、 $ post()関数自体がすぐに戻り、次のコード行(この場合は alert())で実行が継続することを意味します。そして、コールバックとしてAjaxリクエストが $ post()に提供された無名関数を完了すると、その関数に alert()も含まれていれば表示されます。

あなたの最初の質問について:関数内の this の値は、関数がどのように呼び出されたかによって決まり、jQueryは通常コールバック関数を呼び出すときにそれを設定しますが、あなたのUserMenuオブジェクト最も簡単な回避策は、 retrieve()関数のローカル変数に this を保存してから、その変数をコールバックから参照することです。

var UsersMenu = function(){
    this.returnUsers = [];
    this.retrieve = function(posts){
            var self = this,
            temp = [];
            $.post("router.php", { "action": "getUsersMenu", "posts" : posts},
            function(data)
            {
               if(data.response){    
                   for(var i=0; i

Ajaxコールバックが実行されるまでに retrieve()関数が終了しても、JavaScriptクロージャの魔法は内側の匿名関数がそれらのローカル変数にアクセスできることを意味します。

2
追加された
  1. How to access to parent 'this' from jq object (returnUsers) ?

コールバック関数の外側にある var self = this; のようなローカル変数に親 'this'を置き、 self.returnUsers = temp; を使用する必要があります。

  1. Why alert after jq post is calling before some alert in jq post ?

ajaxは非同期で動作するため、jQuery.ajaxメソッドでは、 async:false で同期的に動作するように設定できます。

2
追加された

1 - のようなのような変数を使用する

var that = this.returnUsers; 

jq関数の内部では、次のように参照することができます。

  if(data.response){
       for(var i=0; i

2 - これはajax呼び出しがデフォルトでは非同期であるため、javascriptインタプリタはajax呼び出しが完了するのを待たず、次の文を実行し続けるので、警告をコールバック関数。

0
追加された

私はあなたの2番目の質問に答えることができます。

jq postがjq postの警告の前に呼び出しているのはなぜですか?

AJAXは非同期であるため、AJAXリクエストを発生させ、結果を待つことはありません。コールバック関数を登録し、残りのコードを実行するだけです。この「残りのコード」は、 alert ステートメントです。

コントロールが alert ステートメントに達する前に、あなたのAJAXレスポンスが到着することは(不可能ではないにしても)不可能です。

0
追加された
応答が戻る速度は関係ありません。 Ajaxリクエストを同期させない限り、Ajaxの成功コールバックは、コントロールが次のステートメントに達する前に決して呼び出されることはありません。実際、現在の関数のすべてが現在の関数などと呼ばれる関数のように、最初に完了します。
追加された 著者 nnnnnn,
ありがとう。私の答えを更新しました。
追加された 著者 adarshr,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript