2016-11-18 3 views
-1

との奇妙な行動だから私は、次のコードを含む難問がありますJavascriptを - インデックスオブジェクト配列

$scope.getUserContact = function(data) { 
    var i; 
    for (i = 0; i < data.length; i += 1) { 
     $http({ 
      method: 'GET', 
      url: [Removed] 
     }).then(function successCallback(response) { 
      alert(JSON.stringify(data)); 
      alert(data.length); 
      alert(JSON.stringify(data[i])); 
      ... 
     }, function errorCallback(response) { 
     }); 
    } 
} 

最初の行には出してくれる:

[ 
    { 
     "listingId":"String", 
     ...other Strings and ints ... 
    } 
] 

基本的には、1からなる配列を吐き出しますオブジェクト。

2行目では、期待されるように、配列の長さは1

3行目は、私はちょうどない

undefined

を吐き出している

1

を吐き出します私にオブジェクトを与えるのではなく、配列をインデックス化して突然undefinedという結果になることを理解するインデックス。

dataが関数のパラメータであることが注目されるかもしれません。

助けが必要ですか?私はそれが私の一部では愚かなエラーか、JavaScriptの深みからの奇妙で不明な動作だと思います。

+4

からの約束を使用する必要があります。 –

+0

@ScottMarcus更新されましたが、私は1つのフィールドしかリストしませんでした。残りはすべて文字列と数字です。 –

+0

'alert(data.length);の後の' i'値を参照してください。 – Mahi

答えて

1

問題は$http要求がI = data.lengthの要求が終了すると、すべてのコールバックが最後に呼び出されますときに最初のループは、その後のすべての要求

  • が初期化されますので、

    • 非同期であるということですiの値、あなたはあなたがコールバック

      で同じiを使用しないようにそのようなことを行う必要があります

    を望んでいない

    $scope.getUserContact = function(data) { 
     
        var i; 
     
        for (i = 0; i < data.length; i += 1) { 
     
        doRequest(data, i); 
     
        } 
     
    } 
     
    
     
    function doRequest(data, i) { 
     
        $http({ 
     
        method: 'GET', 
     
        url: [Removed] 
     
        }).then(function successCallback(response) { 
     
        alert(JSON.stringify(data)); 
     
        alert(data.length); 
     
        alert(JSON.stringify(data[i])); 
     
        ... 
     
        }, function errorCallback(response) {}); 
     
    }

    また、あなたの流れをより制御したい場合は、我々は `data`が何であるかを確認する必要が$http$q

    $scope.getUserContact = function(data) { 
     
        var requests = data.map(function(d, i) { 
     
        return doRequest(data, i) 
     
        }); 
     
        return $q.all(requests).then(function(requestsResults) { 
     
        // do something when every requests have ended 
     
        }); 
     
    } 
     
    
     
    function doRequest(data, i) { 
     
        return $http({ 
     
        method: 'GET', 
     
        url: [Removed] 
     
        }).then(function successCallback(response) { 
     
        // do something when this request have ended 
     
        }, function errorCallback(response) {}); 
     
    }

  • +0

    すべてのリクエストの結果を受け取った後にデータを設定する必要があるので、doRequestへのすべての呼び出しが完了したら、別のコールバックを実行するにはどうすればよいですか? –

    +0

    実際、それは問題ありません - すべての繰り返しの後にデータを更新できます。ありがとうございました。 –

    +0

    呼び出しを待つためには、$ httpが使用している約束を返すことができます(単純な戻り値)。すべて ' – user3