我无法弄清楚我的代码出了什么问题。这似乎是一个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()函数中执行此操作,有人可以说出这两个数组有什么区别,为什么第一个数组会以不同的方式创建?
答案 0 :(得分:2)
因为您是在console.logging之前最有可能获得数组的值,并且在控制台内部,chrome会更新数组(因为它是一个引用),而不是长度(因为它是基元)。这就是为什么在数组中可以看到length属性设置正确的原因。 如果您这样做:
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');
你明白我的意思了。
答案 1 :(得分:2)
这是一个异步问题。您是在Promise的“解决”功能之外调用console.log()
。
var myArray = []
$http.get(localFilePath).then(function(result) {
myArray.push("123")
})
// outside resolve function
console.log(myArray)
由于这是异步操作,因此仅在$http.get()
请求完成后(通常在几百毫秒后)才调用resolve函数。但是,它不会等待,因此其余代码将继续运行。因此,它启动了get()
,然后在http请求有机会完成之前立即运行console.log()
,因此在调用console.log()
时它尚未填充数组。 / p>
如果将console.log()
放在resolve函数中,则会看到数组已正确填充,因为它等待http请求完成,然后填充数组,然后仅 是否打印了结果。
$http.get(localFilePath).then(function(result) {
myArray.push("123")
// inside resolve function
console.log(myArray)
})
答案 2 :(得分:0)
我已经了解了您的问题,并尝试了以下代码,但我得到的数组正确。您正在分配推送从服务返回的对象,而不是从array.Array.push()与$ http.get()服务和$ http.get()服务外部相同。
var myArray = [];
$http.get(localFilePath).then(
function(success){
myArray.push("123");
return success
},
function(error){
// other stuff
return success
});
console.log(myArray);
var myArray2 = [];
myArray2.push("123");
console.log(myArray2);