Javascript-使用Promise而不拒绝它会导致内存泄漏吗?
作者:互联网
这个问题已经在这里有了答案: > Will not resolving a deferred create memory leaks? 1个
代码如下:
function test(value){
return new Promise(function (fulfill, reject){
try {
fulfill(true);
} catch(e) {
throw e;
}
});
}
我担心的是,当您使用Promise并引发错误而不是reject(e)时,这会导致内存泄漏吗?
因为对我来说,抛出错误而不是拒绝错误不会拒绝或退出promise之外的错误.该错误将在Promise中消失.让我知道你的意见.
解决方法:
抛出错误将自动拒绝Promise.阅读更多关于它here
但是有一些事情需要讨论.看下面的代码.代码抛出错误.错误从promise内部抛出.它将自动拒绝并启动捕获链.
function test(value){
return new Promise(function (fulfill, reject){
throw e;
});
}
test('sample text').then(result=>console.log(result)).catch(result=>console.log(result))
但是如果我在诺言中使用了Web API例如setTimeout()怎么办.看下面的代码:
function test(value){
return new Promise(function (fulfill, reject){
setTimeout(function(){
throw new Error('haha');
},1000)
});
}
test('sample text').then(result=>console.log(result)).catch(result=>console.log(result))
Web API是异步的.每当从promise内部调用Web API时,JavaScript引擎都会将该异步代码带到外部执行.简单来说,Web API或异步代码将在主调用堆栈之外执行.
因此,从setTimeout()引发错误将没有任何对调用方promise的引用,因此无法启动catch块.如果有任何错误,则需要从setTimeout()中拒绝它以启动catch块.
会导致内存泄漏吗?
答:不可以
一旦完成执行,test().then().catch()将被垃圾回收.但是如果您将诺言保存在像var p = test();这样的全局变量中, p.then().catch(),则变量p将保留在内存中,不会被垃圾回收.但这不是内存泄漏.内存泄漏是一个完全不同的方面,不适用于这种情况.
标签:es6-promise,memory-leaks,javascript 来源: https://codeday.me/bug/20191025/1928388.html