1
function makeHttpRequest(url, success) {
 $.ajax({
        url: url,
   dataType: "jsonp",
crossDomain: true,
   mimeType: 'application/javascript', 
      async: false,
    success: success
  });
} 

   var actions = {
       get_min_hit_list_bounty: function (user_id) {
          makeHttpRequest("get_min_hit_list_bounty?target_id=" + user_id + "&", function (data) {
             var data = data['body'],
                xml = convert(data);
             this.min_cost = $(xml).find('min_cost').text();

         this.cost = function () {
            return this.min_cost;
         }
      });
   }
};
var myBounty = new actions.get_min_hit_list_bounty(user);
alert(myBounty.cost());

このタイプのオブジェクトからは何も返すことができません。プロトタイプの使用と「これ」を使用して公開する方法についてはたくさん読んだことがありますが、どこにも行き着きません。誰かがこれが機能しない理由を説明できますか?

TypeError:オブジェクト[オブジェクトオブジェクト]にはメソッド'cost'がありません

4

2 に答える 2

1

これは、オブジェクトコンストラクターとは何の関係もありません。

最も重要なのは、非同期呼び出しがどのように機能するかを混乱させていることです(AJAXの最初のA!)。の無名関数makeHttpRequestは、リクエストの結果とともに呼び出されます。これは、残りのコードが実行された後、またはまったく実行されない場合があります。

コードをイベント駆動型にする必要があります。つまり、AJAXリクエストを作成し、レスポンスが返されたときにコードを実行します。

例えば:

var onSuccess = function(data) {
    var data = data['body'],
    xml = convert(data);
    // ... etc
}

makeHttpRequest(url, onSuccess);
于 2012-08-12T22:32:22.490 に答える
0

私はそれがこのように見えるべきだと信じています:

var actions = {
       get_min_hit_list_bounty: function (user_id) {
            this.userId = user_id;
            this.min_cost = 999999;

            this.cost = function () {
                return this.min_cost;
            };

            this.getMinCost = function(callback) {
                var me = this;

                var queryString = [
                "get_min_hit_list_bounty?target_id=",
                this.userId,
                "&"].join("");

                makeHttpRequest(queryString, function (data) {
                    var data = data['body'],
                    xml = convert(data);
                    me.min_cost = $(xml).find('min_cost').text();
                    callback.apply(me);
                });
            }
        }
};

var myBounty = new actions.get_min_hit_list_bounty(user);

myBounty.getMinCost(function() {
    alert(this.cost());
});

非同期コードがどのように機能するかを理解する必要があります。結果的に実行されるのは、単なる一連の命令ではありません。イベントとコールバックの観点から考えてください。Googleがお手伝いします。

于 2012-08-12T23:31:19.207 に答える