Advertisement
Guest User

Untitled

a guest
Aug 14th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Создайте класс, обладающий следующим поведением:
  3.  * const values = ['hello', 'javascript', 'world'];
  4.  * const instances = values.map(str => new NumberAndString(str));
  5.  *
  6.  * const resultConcatenation = instances.join(' '); // == 'hello javascript world'
  7.  * const resultCharCount = instances.reduce((obj, memo) => memo + obj, 0); // == 20
  8.  *
  9.  * Для реализации используйте протокол [Symbol.toPrimitive]
  10.  * @class NumberAndString
  11.  * @param {String} string value
  12.  */
  13. class NumberAndString {
  14.   constructor(string) {
  15.     this.string = string;
  16.   }
  17.  
  18.   [Symbol.toPrimitive](hint = 'default') {
  19.     return hint === 'string' ? this.string : this.string.length;
  20.   }
  21. }
  22.  
  23. /* ============================================= */
  24.  
  25. /**
  26.  * Сделать функцию, которая reject'ит возвращаемый промис, передавая в качестве ошибки строку 'timeout_error',
  27.  * если он не resolve'ится за указанный timeout, или ведет себя эквивалентно исходному.
  28.  * В учебных целях для этой задачи просьба не использовать Promise.race.
  29.  *
  30.  * @param {Promise} promise исходный промис
  31.  * @param {Number} timeoutInMilliseconds время для timeout в миллисекундах
  32.  * @return {Promise} промис с нужным поведением
  33.  */
  34. function promiseTimeout(promise, timeoutInMilliseconds) {
  35.   return new Promise((resolve, reject) => {
  36.     setTimeout(() => reject(new Error('timeout_error')), timeoutInMilliseconds);
  37.     promise.then(result => resolve(promise), error => reject(error));
  38.   });
  39. }
  40.  
  41. /* ============================================= */
  42.  
  43. /**
  44.  * Реализовать функцию, поведение которой аналогично поведению Promise.all,
  45.  * которая возвращает в качестве результата rejected промис c первым reject value или resolve с массивом resolveValues,
  46.  * в соответствущих исходному массиву промисов позициях, если не было ни одного промиса с reject.
  47.  * @param {Array<Promise>} promises - массив с исходными промисами
  48.  * @return {Promise}
  49.  */
  50. function promiseAll(promises) {
  51.   if (!Array.isArray(promises)) {
  52.     throw new Error();
  53.   }
  54.  
  55.   return new Promise((resolve, reject) => {
  56.     let count = 0,
  57.       res = [];
  58.  
  59.     if (promises.length === 0) {
  60.       resolve([]);
  61.     }
  62.     for (let i = 0; i < promises.length; ++i) {
  63.       if (promises[i].toString() !== Promise) {
  64.         promises[i] = Promise.resolve(promises[i]);
  65.       }
  66.       promises[i].then(result => {
  67.         count++;
  68.         res[i] = result;
  69.         if (count === promises.length) {
  70.           resolve(res);
  71.         }
  72.       }).catch(error => reject(error));
  73.     }
  74.   });
  75. }
  76.  
  77. /* ============================================= */
  78.  
  79. /**
  80.  * Реализовать функцию, поведение которой аналогично поведению Promise.race,
  81.  * которая возвращает в качестве результата промис c первым resolve value или reject value в массиве исходных промисов
  82.  * @param {Array<Promise>} promises - массив с исходными промисами
  83.  * @return {Promise}
  84.  */
  85. function promiseRace(promises) {
  86.   return new Promise((resolve, reject) => {
  87.     for (let i = 0; i < promises.length; ++i) {
  88.       promises[i].then(result => resolve(result), error => reject(error));
  89.     }
  90.   });
  91. }
  92.  
  93. /* ============================================= */
  94.  
  95. /**
  96.  * Изменить поведение чисел таким образом, чтобы указанные конструкции были эквивалетны при условии,
  97.  * что римские цифры могут быть любыми.
  98.  * 0..V => [0, 1, 2, 3, 4]
  99.  * 0..VII => [0, 1, 2, 3, 4, 5, 6]
  100.  * 0..X => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  101.  * Подсказка - необходимо использовать Proxy - объекты
  102.  * */
  103. function parseRomanNominal(number) {
  104.   const fontArab = [0, 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500,
  105.     900, 1000, 4000, 5000, 9000, 10000];
  106.   const fontRoman = ['0', 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC',
  107.     'C', 'CD', 'D', 'CM', 'M', 'M&#8577;', '&#8577;', '&#8577;&#8578;', '&#8578;'];
  108.  
  109.   number = number.toUpperCase();
  110.   let result = 0,
  111.     posit = 0,
  112.     n = fontArab.length - 1;
  113.  
  114.   while (n >= 0 && posit < number.length) {
  115.     if (number.substr(posit, fontRoman[n].length) === fontRoman[n]) {
  116.       result += fontArab[n];
  117.       posit += fontRoman[n].length;
  118.     } else { n--; }
  119.   }
  120.   return result;
  121. }
  122.  
  123. const proxy = new Proxy(Number, {
  124.   get(target, prop) {
  125.     prop = parseRomanNominal(prop);
  126.     return Array.from(Array(prop).keys());
  127.   }
  128. });
  129.  
  130. Object.setPrototypeOf(Number.prototype, proxy);
  131.  
  132. /* ============================================= */
  133.  
  134. function delayPromise(promise, timeout) {
  135.   let resolveValue = null;
  136.   let rejectValue = null;
  137.  
  138.   promise.then(
  139.     value => { resolveValue = value; },
  140.     err => { rejectValue = err; }
  141.   );
  142.  
  143.   return new Promise((resolve, reject) => {
  144.     setTimeout(() => {
  145.       if (resolveValue !== null) {
  146.         resolve(resolveValue);
  147.       } else if (rejectValue !== null) {
  148.         reject(rejectValue);
  149.       } else {
  150.         promise.then(resolve, reject);
  151.       }
  152.     }, timeout);
  153.   });
  154. }
  155.  
  156. module.exports = {
  157.   NumberAndString,
  158.   promiseTimeout,
  159.   promiseAll,
  160.   promiseRace,
  161.   delayPromise
  162. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement