AngularJs-$ http.get()中的Array.push()产生有缺陷的数组

时间:2019-01-24 18:17:14

标签: javascript arrays angularjs http-get

我无法弄清楚我的代码出了什么问题。这似乎是一个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开发人员工具的屏幕截图:

enter image description here

现在,这看起来像一个适当的数组,但事实并非如此。如果我console.log(myArray.length),它返回0

以下是使用相同代码myArray.push("123") 外部 $http.get()函数的正确数组的外观:

enter image description here

如果我在 $ http.get()函数中执行此操作,有人可以说出这两个数组有什么区别,为什么第一个数组会以不同的方式创建?

3 个答案:

答案 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);