1

Тема: 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();