代码如下:
function test(value){
return new Promise(function (fulfill, reject){
try {
fulfill(true);
} catch(e) {
throw e;
}
});
}
我担心的是,当您使用Promise
和throw error
代替reject(e)
时,会导致内存泄漏吗?
因为对我而言,抛出错误而不是拒绝它不会拒绝或退出承诺之外的错误。错误只会在Promise
内部出现。让我知道你的意见。
答案 0 :(得分:3)
抛出错误会自动拒绝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))
但是,如果我在我的承诺中使用了诸如setTimeout()
之类的Web API,那该怎么办呢?请查看以下代码:
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引擎都会将async
代码移到外部执行。简单来说,Web API或异步代码在主调用堆栈之外执行。
因此,从setTimeout()
抛出错误不会有任何来电承诺的引用,因此无法启动catch
阻止。如果有任何错误,您需要reject()
setTimeout()
catch
来启动no
阻止。
是否会导致内存泄漏?
答案: test().then().catch()
var p = test(); p.then().catch()
会在完成执行后立即进行垃圾回收。但如果你能在 p
这样的全局变量中保留这个承诺,那么变量 // Delete this line
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
将保留在内存中,它会赢得& #39;垃圾收集。但这不是内存泄漏。内存泄漏是一个完全不同的方面,并不适用于这种情况。
答案 1 :(得分:1)
这不会导致内存泄漏。但是,使用其中一个时,值得考虑的差异。
与throw
不同,reject()
不会终止控制流程。因此,如果您希望在拒绝后继续执行代码,则可能更喜欢reject()
。
在嵌套承诺中使用throw
会导致意外结果。在这种情况下,建议使用reject()
。