3

オブジェクトの1つ(ajax呼び出しを介して作成された)をコンソールに印刷すると、次のようになります。

Object
discreet: Array[2]
range: Array[2]
__proto__: Object

しかし、手動でオブジェクトを作成すると、正しく戻ってきます。

Object {range: Array[2], discreet: Array[2]}
discreet: Array[2]
range: Array[2]
__proto__: Object

これら2つのオブジェクトの違いと、最初のオブジェクトのプロパティにアクセスできない理由を誰かに説明してもらえますか?

編集:最初のオブジェクトは次の人によって作成されています:

var obj = {}

$http.get('/discreet').then( function(data) { obj.discreet = data } );
$http.get('/range').then( function(data) { obj.range = data } );

print(obj);

私が手作りしている2番目:

var obj = { range: [1,2], discreet: [1,2] }
print(obj);
4

2 に答える 2

1

これは、非同期プログラミングの誤解の典型的なケースです。知っておくべきことは次のとおりです。

  1. JavaScript はシングルスレッドであるため、一度に 1 つのことしか実行できません。

  2. のコールバック関数は非同期.thenです。すぐには実行されません。代わりに、Ajax 要求がサーバーから返されるたびに、実行のためにキューに入れられます。$http.get

  3. 非同期コールバックは、現在の関数が完了するまで実行できません。実行スレッドを徴用することはできませんが、現在の関数がそれを使用し終えるまで辛抱強く待つ必要があります。

したがって、 when print(obj);is run にobjはまだプロパティが割り当てられていません。これは、どちらの非同期コールバックも実行する機会がないためです。

コンソールで生成された を展開したときにプロパティが表示れる場合Objectは、Chrome がコンソールに出力されたオブジェクトのプロパティを提供するのを怠っているためです。実際にオブジェクトをクリックして展開したときにのみ、オブジェクトにそのプロパティを要求します (その時点でコールバックが完了します)。

于 2012-09-12T20:26:10.307 に答える
1

最初のものは、応答が返される前に単にprintedxhrであるため、ログに記録された時点でオブジェクトは空です。

2 つ目は、データが入力された後にログに記録されます。

于 2012-09-12T20:26:22.310 に答える