var Q = function(funcs, callback){
var returnCount = 0;
if( typeof(funcs) == "function" ) funcs = [funcs];
var totalCount = funcs.length;
var values = [];
var createCallback = function(i){
return function(result){
values[i] = result;
returnCount++;
if( returnCount == totalCount ){
callback(values);
}
}
}
for(var i=0;i<totalCount;i++){
// How to keep the scope?
funcs[i](createCallback(i));
}
}
function A(o){
this.v = o || 10;
}
A.prototype.test = function(cb){ cb(this.v); }
var a = new A();
var b = new A(20);
Q([a.test, b.test], function(results){
print(results[0]);
print(results[1]);
});
dmFyIFEgPSBmdW5jdGlvbihmdW5jcywgY2FsbGJhY2spewogICAgdmFyIHJldHVybkNvdW50ID0gMDsKICAgIGlmKCB0eXBlb2YoZnVuY3MpID09ICJmdW5jdGlvbiIgKSBmdW5jcyA9IFtmdW5jc107CiAgICB2YXIgdG90YWxDb3VudCA9IGZ1bmNzLmxlbmd0aDsKICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgIAogICAgdmFyIGNyZWF0ZUNhbGxiYWNrID0gZnVuY3Rpb24oaSl7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHJlc3VsdCl7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHJlc3VsdDsKICAgICAgICAgICAgcmV0dXJuQ291bnQrKzsKICAgICAgICAgICAgaWYoIHJldHVybkNvdW50ID09IHRvdGFsQ291bnQgKXsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbHVlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIGZvcih2YXIgaT0wO2k8dG90YWxDb3VudDtpKyspewogICAgICAgIC8vIEhvdyB0byBrZWVwIHRoZSBzY29wZT8KICAgICAgICBmdW5jc1tpXShjcmVhdGVDYWxsYmFjayhpKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIEEobyl7CiAgICB0aGlzLnYgPSBvIHx8IDEwOwp9CgpBLnByb3RvdHlwZS50ZXN0ID0gZnVuY3Rpb24oY2IpeyBjYih0aGlzLnYpOyB9Cgp2YXIgYSA9IG5ldyBBKCk7CnZhciBiID0gbmV3IEEoMjApOwoKUShbYS50ZXN0LCBiLnRlc3RdLCBmdW5jdGlvbihyZXN1bHRzKXsgCiAgICBwcmludChyZXN1bHRzWzBdKTsKICAgIHByaW50KHJlc3VsdHNbMV0pOwp9KTs=