【发布时间】:2018-01-22 23:17:47
【问题描述】:
我对 Javascript 比较陌生,对 Promise 及其范围有些困惑。
假设我有以下方法:
function fetchAllData(){
//Calling backend to fetch data, returns a promise
backend.getMoreData(localData.length, 1000).then(function(data){
//Store fetched data
for(let i = 0; i < data.length; i++){
localData.push(data[i]);
}
//If there's more data, invoke fetchData() again
if(data.length > 0){
log("Fetching more data...");
fetchAllData();
} else{
log("Fetched all data!");
}
} );
}
该方法基本上是这样操作的:
- 从后端 API 获取一些数据(API 返回一个承诺)
- 一旦履行承诺,数据就会添加到局部变量中
- 如果要获取更多数据,则递归调用该函数以获取更多数据,直到获取所有数据为止
我的问题是:这是一个潜在的“堆栈炸弹”吗?或者,由于promise机制,调用函数在调用“then()”方法之前从栈中弹出?
我之所以问,是因为我看到内存使用量高于预期,并且在使用它时一些浏览器崩溃,几乎让我怀疑 data 的各种实例在整个链完成之前不会被取消分配
【问题讨论】:
-
不,这不应该是一个堆栈炸弹。每次都应该清除堆栈,因为回调是异步调用的,而且我看不到任何会无限期徘徊的闭包变量。
data数组的各个元素是否有可能引用占用内存的东西,例如他们有对data数组的反向引用,或者关于请求的一些数据,或者什么?当所有的东西都被检索到时,你预计localData有多大? -
backend.getMoreData如何获取“下一个”数据? – 即,如果数据是分页的,您通常会指定要查询的页面
标签: javascript recursion promise