javascript – 使用递归承诺阻止内存泄漏
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 使用递归承诺阻止内存泄漏,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2564字,纯文字阅读大概需要4分钟。
内容图文
![javascript – 使用递归承诺阻止内存泄漏](/upload/InfoBanner/zyjiaocheng/951/3564be0932b0454fa921ad06ff14b591.jpg)
如何使用Q library创建JavaScript Promises的递归链?以下代码无法在Chrome中完成:
<html>
<script src="q.js" type="text/javascript"></script>
<script type="text/javascript">
//Don't keep track of a promises stack for debugging
//Reduces memory usage when recursing promises
Q.longStackJumpLimit = 0;
function do_stuff(count) {
if (count==1000000) {
return;
}
if (count%10000 == 0){
console.log( count );
}
return Q.delay(1).then(function() {
return do_stuff(count+1);
});
}
do_stuff(0)
.then(function() {
console.log("Done");
});
</script>
</html>
解决方法:
这不会堆栈溢出,因为promises会破坏堆栈,但它会泄漏内存.如果在node.js中运行相同的代码,则会出现如下错误:
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
这里发生的事情是,正在创建一个非常长的嵌套承诺链,每个承诺等待下一个.你需要做的是找到一种方法来压扁该链,以便只返回一个顶级承诺,等待目前代表一些实际工作的最内在的承诺.
打破链条
最简单的解决方案是在顶层构建一个新的promise并使用它来打破递归:
var Promise = require('promise');
function delay(timeout) {
return new Promise(function (resolve) {
setTimeout(resolve, timeout);
});
}
function do_stuff(count) {
return new Promise(function (resolve, reject) {
function doStuffRecursion(count) {
if (count==1000000) {
return resolve();
}
if (count%10000 == 0){
console.log( count );
}
delay(1).then(function() {
doStuffRecursion(count+1);
}).done(null, reject);
}
doStuffRecursion(count);
});
}
do_stuff(0).then(function() {
console.log("Done");
});
虽然这个解决方案有点不优雅,但您可以确定它可以在所有承诺实现中使用.
那么/ promise现在支持尾递归
一些承诺实现(例如来自npm的promise,您可以从https://www.promisejs.org/下载为独立库)正确检测到这种情况并将承诺链折叠成单个承诺.如果您不保留对顶级函数返回的承诺的引用(即,立即调用它,请不要保留它).
好:
var Promise = require('promise');
function delay(timeout) {
return new Promise(function (resolve) {
setTimeout(resolve, timeout);
});
}
function do_stuff(count) {
if (count==1000000) {
return;
}
if (count%10000 == 0){
console.log( count );
}
return delay(1).then(function() {
return do_stuff(count+1);
});
}
do_stuff(0).then(function() {
console.log("Done");
});
坏:
var Promise = require('promise');
function delay(timeout) {
return new Promise(function (resolve) {
setTimeout(resolve, timeout);
});
}
function do_stuff(count) {
if (count==1000000) {
return;
}
if (count%10000 == 0){
console.log( count );
}
return delay(1).then(function() {
return do_stuff(count+1);
});
}
var thisReferenceWillPreventGarbageCollection = do_stuff(0);
thisReferenceWillPreventGarbageCollection.then(function() {
console.log("Done");
});
不幸的是,没有任何内置的promise实现具有这种优化,并且没有任何计划实现它.
内容总结
以上是互联网集市为您收集整理的javascript – 使用递归承诺阻止内存泄漏全部内容,希望文章能够帮你解决javascript – 使用递归承诺阻止内存泄漏所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。