让我们考虑一下,我们有一个函数在某个事件(例如-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的值,而我需要保留调用时的状态。

例如,如果此事件侦听器几乎同时被调用了两次,它将是:


oldSize == 5,列表增加了10个(例如)元素。但是在$http.get(...).then()内部,我需要使用值oldSize == 5
第二次调用:oldSize == 15(因为在第一次调用中我们将list增加了10个元素)。因此,在这个特定的$http.get(...).then()内部,我想拥有oldSize == 15


我希望这很清楚。拜托,不要建议我改变我的逻辑。我只想知道如何为异步函数的延迟结果保存变量值(在我的情况下是$http.get(...).then(...))。谢谢。

最佳答案

假设您无法在此函数内定义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] = ... ;
       }
     }
}

09-07 16:48