0

Javascript オブジェクト ( testObject) 内で、コールバック関数からのオブジェクトを配列に入力していjQuery.getJSONます。配列は最初にオブジェクト プロパティとして定義され、内部コールバック関数がパブリック オブジェクトにアクセスできるようにしますthis.publicArrayvar passedArray = this

オブジェクトに public メソッドを使用すると、入力された配列の内容をオブジェクトの子プロパティとして公開できますが、配列の内容を直接公開することはできません。

function testObject() {

  this.publicArray = [];
  var passedArray = this;

  $.getJSON('http://...',
    function(data) {
      passedArray.publicArray = [{key:'value'},{key:'value'},{key:'value'}]  
  });

  this.testMethod = function() {
    console.log(this);
    console.log(this.publicArray);
  };
}

myObject = new testObject(); // [1]
myObject.testMethod(); // [2]

戻り値:

 [1] > thisArray: Array[3]
         0: Object
           key: "value"
         1: Object
           key: "value"
         2: Object
           key: "value"
         length: 3

 [2] > []

配列にまったく同じオブジェクトを入力しても、コールバック関数からではなく、期待どおりに動作するため、理解できません:

  1. オブジェクトメソッドから配列の内容にアクセスする方法
  2. 配列の内容が開発者ツールに表示され、スクリプトには表示されないのはなぜですか。

ありがとう - そして、私が台無しにした他のことについて私に教えてください。

4

2 に答える 2

1

Ajax は非同期です。コールバックは、新しいインスタンスが作成されてから一定期間後に発生します。

このようなことを試してください。データを操作する準備が整うと、 onReady コールバックが発生します (テストされていません)。

function testObject() {

    this.itsArray = [];
    var passedArray = this;

    var request = $.getJSON('http://...', function(data) {
        passedArray.itsArray = [
            {
            key: 'value'},
        {
            key: 'value'},
        {
            key: 'value'}
        ];
    });

    this.testMethod = function() {
        console.log(this);
        console.log(this.itsArray);
    };
    this.onReady = function(fn) {
        request.done(fn)
    };
}

var myObject = new testObject(); // [1]
// the following can be used multiple times
myObject.onReady(function() {
    myObject.testMethod(); // [2]
});​
于 2012-06-18T18:02:26.523 に答える
1

あなたがやろうとしていることにはいくつかの問題があります。

1 つは、'testObject' の新しいインスタンスを作成するときに、配列プロパティ 'itsArray' を設定する ajax 要求を作成することです。このプロパティは、ajax リクエストが完了するまでデフォルト値 ([]) になります。

AJAX はデフォルトで非同期であるため (つまり、コードは「getJSON」呼び出しを実行し、すぐに次のステートメントに進みます)、「testMethod」への呼び出しは、ajax 要求が完了するまで空の配列を返します。

あなたができることは、ajaxリクエストが返す「約束」(Jquery Deferred Objects)を使用し、次のように約束が解決されるのを待つことです:

function testObject() {

  this.itsArray = [];
  var passedArray = this;

  this.getJSONPromise = $.getJSON('http://...',
    function(data) {
      passedArray.itsArray = [{key:'value'},{key:'value'},{key:'value'}]  
  });

  this.testMethod = function() {
    console.log(this);
    console.log(this.itsArray);
  };
}

操作する「promise」オブジェクトができたので、それが完了するのを待って testMethod を呼び出すと、データが得られます。

myObject = new testObject();
$.when(myObject.getJSONPromise).then(function()
{
    myObject.testMethod();
});
于 2012-06-18T18:08:54.633 に答える