javascript - AngularJs - $http.get() 中的 Array.push() 会产生一个有缺陷的数组
问题描述
我无法弄清楚我的代码有什么问题。这似乎是一个javascript问题。
我正在使用$http.get加载本地 txt 文件(有不同的方法吗?)。我想将此内容推送到数组中。为了测试,我只是推送任何字符串,以确保它与实际的 txt 文件无关。
var myArray = [];
$http.get(localFilePath).then(
function(success){
myArray.push("123");
},
function(error){
// other stuff
});
console.log(myArray);
这个简单的代码不会生成正确的数组。如果我console.log创建的数组,这是 Chrome 开发工具的屏幕截图:
现在,这看起来像一个正确的数组,但事实并非如此。如果我console.log(myArray.length)
返回0。
myArray.push("123")
相反,在函数外部 使用相同的代码时,正确的数组应该是这样的$http.get()
:
如果我在$http.get()函数中执行它,有人能说出这两个数组之间的区别以及为什么第一个数组的创建方式不同吗?
解决方案
因为您在数组最有可能获得值之前是 console.logging,并且在控制台内部,chrome 更新数组(因为它是一个引用)而不是长度(因为它是一个原语)。这就是为什么作为数组的一部分,您可以看到正确设置的长度属性。如果你这样做:
var myArray = [];
let $http = { get: () => {
var p = new Promise((resolve, reject) => {
setTimeout(() => resolve('hi'), 1000);
})
return p;
}}
$http.get('').then(
function(success){
myArray.push("123");
console.log(myArray, myArray.length, 'after');
},
function(error){
// other stuff
}
);
console.log(myArray, myArray.length, 'before');
你可以明白我的意思。
推荐阅读
- c# - 如何引发属性更改事件以触发其他属性
- arrays - 从特定元素添加数组中的快速求和数
- azure - 适用于容器的 Web 应用程序 (Linux) 版本的 app_offline.htm
- parsing - Haskell:将可能是多种类型的对象解析为一种类型
- node.js - 从 component.ts 文件加载不同的 component.html 文件?
- python - Python/Flask 重新定义和初始化变量
- android - 这个 Kotlin Singleton 实现是否可以用于垃圾收集?
- javascript - 为什么在 3 行后面追加会导致它崩溃?
- javascript - React 原生 props 声明混淆
- oracle - 更改 currval 的 Oracle 序列为什么不直接删除它并重新创建?