2017-06-20 49 views
0

讓我們考慮一下我們有一個函數,在某個事件(例如 - scroll事件)上調用。該功能將更多項目加載到某個列表中。

假設這個函數的邏輯設計如下:

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. 第二次調用: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 
      [...] 
     }); 
};