-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
promise keeper - from gist https://gist.github.com/3729142 for Q issue …
- Loading branch information
Showing
2 changed files
with
103 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,71 @@ | |||
var noop = function(){}; | |||
// remove existing Q (hopefully it has no state...) | |||
delete require.cache[require.resolve('q')]; | |||
|
|||
// remove freezing so we can modify Q | |||
var origFreeze = Object.freeze; | |||
Object.freeze = noop; | |||
|
|||
// require Q and restore freezing | |||
var Q = require('q'); | |||
Object.freeze = origFreeze; | |||
|
|||
// copy/pasted from Q - we'll defend it after we modify it | |||
var defend = Object.freeze || noop; | |||
if (typeof cajaVM !== "undefined") { | |||
defend = cajaVM.def; | |||
}; | |||
|
|||
var current = [], prev = [], total=0; | |||
|
|||
// add the promise to an array | |||
// make sure to remove it when it is done | |||
// oh, and "defend" it... | |||
var recordPromise = function(promise) | |||
{ | |||
current.push(promise); | |||
total++; | |||
|
|||
var rm = function() | |||
{ | |||
// not the most efficient way... but who cares | |||
current = current.filter(function(i){ return i!=promise; }); | |||
}; | |||
|
|||
var nextPromise = promise.then(rm, rm); | |||
defend(nextPromise); | |||
return nextPromise; | |||
} | |||
|
|||
|
|||
// modify makePromise and defer - I think these are the only places | |||
// that create promises | |||
var origMake = Q.makePromise; | |||
Q.makePromise = function() | |||
{ | |||
return recordPromise(origMake.apply(this, arguments)); | |||
}; | |||
|
|||
var origDefer = Q.defer; | |||
Q.defer = function() | |||
{ | |||
var deferred = origDefer.apply(this, arguments); | |||
deferred.promise = recordPromise(deferred.promise); | |||
return deferred; | |||
}; | |||
|
|||
// defend things that should've been defended... | |||
defend(Q.makePromise.prototype); | |||
defend(Q); | |||
|
|||
// logs: | |||
// * how many are still unresolved | |||
// * how many of those were in the previous snapshot and are still unresolved | |||
// * how many new promises were created since last snapshot | |||
exports.snapshot = function() { | |||
var now = new Date().getTime(); | |||
var stillCount = current.filter(function(p){ return prev.indexOf(p)>=0; }).length; | |||
console.log("Not kept:",current.length,"From before:",stillCount,"Generated:",total); | |||
prev = current.slice(); | |||
total = 0; | |||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,32 @@ | |||
var keeper = require('./04-promiseKeeper'); | |||
var Q = require('q'); | |||
|
|||
var PROBABILITY_OF_RESOLVE = 0.1; | |||
var N_PUSHER = 100; | |||
var N_RESOLVER = 200; | |||
var N_LOG = 500; | |||
|
|||
|
|||
var deferreds = []; | |||
|
|||
var resolver = function() { | |||
console.log("Resolving"); | |||
deferreds = deferreds.filter(function(p){ | |||
var shouldResolve = Math.random() <= PROBABILITY_OF_RESOLVE; | |||
if (shouldResolve) | |||
{ | |||
p.resolve(); | |||
} | |||
return !shouldResolve; | |||
}); | |||
setTimeout(resolver, Math.random()*N_RESOLVER); | |||
}; | |||
var pusher = function() { | |||
console.log("Pushing"); | |||
var deferred = Q.defer(); | |||
deferreds.push(deferred); | |||
setTimeout(pusher, Math.random()*N_PUSHER); | |||
}; | |||
resolver(); | |||
pusher(); | |||
setInterval(keeper.snapshot, N_LOG); |