Тема: Promise.race() копіює аргументи не так, як треба
В мене була ідея погратись з промісами.
Я б хтів симулювати гоночки.
Нехай у нас є 10 машинок, котрі змагаються одна з одною, і коли якась машинка фінішує, я б хтів знати, яка саме машинка це зробила.
Для цього я створив клас, що наслідується від класу Promise. Ідея була проста - створити 10 екземплярів мого класу, при ініцілізації передавати в кожен клас
1. Функцію, котра б далі передавалась в конструктор Promise через виклик super
2. Унікальне ім'я, котре б прикріплювалось до властивості з ім'ям name
Після чого я б передавав ці десять класів в метод race(), і коли б ми мали переможця, то й б просто виводив їм'я цього переможця.
Але виявилось так, що коли я передаю 10 класів в метод race(), то воно їх копіює, при цьому властивість name втрачається! До речі, коли метод race() повертає значення, то це значення теж являється копією мого класу, котра не має властивості з ім'ям name.
Чому це так, і як це можна вирішити?
Я це зміг вирішити, але таким кривеньким способом, що якось аж фі. Хотілося б красивішого вирішення. Озьдо кід і посилання на jsfiddle https://jsfiddle.net/eosrcvxv/
function getFunc(name="def_name"){
let func = function(resolve, reject)
{
let f = function()
{
let r = Math.floor(Math.random()*100)+1;
if(r!=55)
{
setTimeout( function(){ f(); }, 20 );
}
else
{
resolve("won! "+func.n);
}
}
f();
};
func.n=name;
return func;
};
class MyP extends Promise {
constructor(func)
{
super(func);
//console.log("MyP: "+MyP.count++);
//console.log("instanceof "+(this instanceof MyP));
}
success(resolve, reject)
{
return this.then((val)=>{console.log("val: "+val);}, reject);
}
}
MyP.count=0;
let a = [];
for(let i = 0; i<10; i++)
{
let p = new MyP(getFunc("p"+i));
p.name="p"+i;
a.push(p);
}
//console.log("hr");
let p = MyP.race(a);
// console.log("is p instance of MyP? "+(p instanceof MyP));
p.success();