Skip to content

Instantly share code, notes, and snippets.

@lrvick
Last active April 10, 2018 09:08
Show Gist options
  • Save lrvick/c7ab0f0b18be4b06a383 to your computer and use it in GitHub Desktop.
Save lrvick/c7ab0f0b18be4b06a383 to your computer and use it in GitHub Desktop.
iojs/node memory leaks when dealing with promises and infinite loops
// This leaks insane amounts of memory
var fetchCallback = function(resolve, reject) {
resolve({'some':'test'})
}
var fetch = function() {
return new Promise(fetchCallback)
}
var processMessage = function(message){
console.log('got new message:',message)
fetch().then(processMessage)
}
fetch().then(processMessage)
// This also leaks an insane amount of memory.
var promiseCallback = function(resolve, reject) {
resolve({'some':'object'})
}
var fetch = function() {
return new Promise(promiseCallback)
}
var processMessage = function(message){
console.log('got new message',message)
lock = false
}
var lock = false;
function loop(){
if (!lock) {
fetch().then(processMessage)
lock = true
}
setImmediate(loop);
}
loop()
// This does not leak, and is at least easier to reason about (thanks @jlai)
var promiseCallback = function(resolve, reject) {
resolve({'some':'object'})
}
var fetch = function() {
return new Promise(promiseCallback)
}
var fetchMessage = function(message){
fetch().then(processMessage)
}
function processMessage(message){
console.log('got new message:',message)
process.nextTick(fetchMessage);
}
processMessage()
// This does not leak but feels kind of insane
var promiseCallback = function(resolve, reject) {
resolve({'some':'object'})
}
var fetch = function() {
return new Promise(promiseCallback)
}
var processMessage = function(message){
console.log('got new message',message)
lock = false
}
var lock = false;
function loop(){
if (!lock) {
fetch().then(processMessage)
lock = true
}
setTimeout(loop, 0);
}
loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment