2017-06-20 13 views
0

何らかのイベント(-イベント)で呼び出される関数があるとしましょう。この関数は、いくつかのリストに多くの項目を読み込みます。

次のようにこの関数のロジックが設計されていることとします

function() { 
    oldSize = list.length; 

    // add new items (prepare them in advance) 
    for (i = 0; i < PAGE_SIZE; i++) list.push({}); 

    $http.get("/next/page/" + oldSize).then(function() { 
     // here I want operate with oldSize value which is actual on moment of 
     // the $http.get invocation: 
     for (i = 0; i < PAGE_SIZE;i++) { 
      // do something with 
      list[oldSize + i] = ... ; 
     } 
    } 
} 

問題は全体の機能が.then(function() {が不適切な値で動作していること、効果につながるものを、ほぼ同時に複数回呼び出すことができるということですoldSizeの変数 - それは最後のlist.lengthの値になりますが、呼び出しの瞬間と同じように保存する必要があります。例えば

このイベントリスナがほぼ同時に2回呼び出された場合、それは次のようになります

  1. oldSize == 5、10(例えば)素子増加リスト。しかし、内部$http.get(...).then()私は値oldSize == 5で作業する必要があります。

  2. 2回目の呼び出し:oldSize == 15(最初の呼び出しで10個の要素でリストが増加したため)。だからこの特に$http.get(...).then()私は持っているoldSize == 15

私はそれがはっきりしていることを望みます。私の論理を変えるように私に言わないでください。私はちょうど非同期関数(私の場合は$http.get(...).then(...))の延期された結果の変数値を保存する方法を知りたいです。ありがとう。

+0

なぜ外側の範囲に 'oldSize'を定義しますか? –

+0

@YuryTarabanko getメソッドを呼び出す前に値を保存する必要がある場合、どこで定義しますか? – Andremoniy

+0

この関数(およびネストされたコールバック)の外側で使用しない場合は、 'var oldSize = list.length'を実行するだけです。そうでなければ私の答えを以下でチェックしてください –

答えて

1

この関数内にoldSizeを定義することができないと仮定すると、他の場所に必要なためです。

function() { 
    oldSize = list.length; 

    // add new items (prepare them in advance) 
    for (i = 0; i < PAGE_SIZE; i++) list.push({}); 


    var currentOldSize = oldSize; 

    $http.get("/next/page/" + oldSize).then(function() { 
     // here I want operate with oldSize value which is actual on moment of 
     // the $http.get invocation: 
     for (i = 0; i < PAGE_SIZE;i++) { 
      // do something with 
      list[currentOldSize + i] = ... ; 
     } 
    } 
} 
1

なぜoldSizeはスコープの外で宣言されているのですか?関数のスコープ内で変数を宣言します。

let list = []; 

function() { 
    let size = list.length; 

    $http.get(...) 
     .then(function() { 
      // handle size 
      [...] 
     }); 
}; 
関連する問題