let list = readHugeList();
let nextListItem = function() {
let item = list.pop();
if (item) {
// process the list item...
nextListItem();
}
};
简而言之就是,函数之行到 timeout 时, 将 nextListItem 放入宏任务队列(原本应该是递归操作), 利用时间循环处理, 然后继续之行之后的代码. 在执行结束之后, 将结束该函数的函数栈. 主栈空了空了之后, 进入宏任务队列, 由时间循环机制处理刚刚放入的 nextListItem . 如此一来, 就没有嵌套函数栈了.
let list = readHugeList();
let nextListItem = function() {
let item = list.pop();
if (item) {
// process the list item...
setTimeout(nextListItem, 0);
}
};
备注:方案缺点也很明显,所有方案脱离场景说好坏都是耍流氓, 可以多一种思路。仅此而已。