让我们考虑一下,我们有一个函数在某个事件(例如-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] = ... ;
}
}
}