3

当我将我的一个对象(通过 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

有人可以向我解释这两个对象之间的区别,以及为什么我无法访问第一个对象的属性吗?

编辑:第一个对象是由以下人员创建的:

var obj = {}

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

print(obj);

我手工制作的第二个:

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

2 回答 2

1

这是一个误解异步编程的经典案例。以下是您需要了解的内容:

  1. JavaScript 是单线程的,所以它一次只能做一件事。

  2. .then附加到的回调函数$http.get是异步的——它不会立即执行。相反,只要 Ajax 请求从服务器返回,它就会排队等待执行。

  3. 在当前函数完成之前,异步回调无法运行。他们不能霸占执行线程,必须耐心等待当前函数完成使用。

因此,当print(obj);运行时,obj尚未分配任何属性,因为异步回调都没有机会运行。

如果您在扩展控制台上生成的内容时确实看到了属性Object,那是因为 Chrome 懒于为控制台中打印的对象提供属性。它只会在您实际单击以展开对象时询问对象的属性(此时回调将完成)。

于 2012-09-12T20:26:10.307 回答
1

第一个只是print在响应返回之前被编辑xhr,所以对象在记录时是空的。

第二个是在填充后记录的。

于 2012-09-12T20:26:22.310 回答