Возможно, я неправильно понял смысл статьи, но я нахожу ее очень вводящей в заблуждение.
Подъем функции getSum:
const getSumLiftP = liftP(getSum);//The function return a simple value, no a promise. In the same way //you would if the code was synchronous. const result = getSumLiftP(promise1, promise2) console.log(result); -> // should log Promise {<pending>}
Комментарии выше (кроме того, что выделен жирным шрифтом) неверны!
getSumLiftP на самом деле является функцией, которая принимает любое количество аргументов и возвращает результат Promise.all, который является отложенным/выполненным обещанием.
В разделе 25.6.4.1 спецификации ECMAScript прямо указано, что:
Функция
all
возвращает новое обещание, которое выполнено с массивом значений выполнения для переданных обещаний, или отклоняет с причиной отклонения первого переданного обещания. Он разрешает все элементы переданного итерируемого объекта в обещания при выполнении этого алгоритма.
Функция подъема:
const liftP = func => (...args) => Promise.all(args).then(values => func(...values))
Приведенное выше закрытие на самом деле является всего лишь утилитой, похожей на карту, которая применяет функцию обратного вызова к каждому разрешенному значению.
В данном случае это ненужный дополнительный уровень сложности.
Вот еще один интересный пример:
function mockFetch(url) { let sections = url.split('/'); let indexOffset = 1; let lastIndex = sections.length - indexOffset; let finalUrlParam = sections[lastIndex]; return Promise.resolve(finalUrlParam); } function add(...args) { let totalSum = 0; for (let input of args) { totalSum += Number(input) || 0; } return totalSum; } async function fetchSumStatic() { let result1 = await mockFetch('http://api/1'); let result2 = await mockFetch('http://api/2'); let finalResult = add(result1, result2); return finalResult; } async function fetchSumDynamic(urls, callback) { return Promise.all(urls.map(mockFetch)).then(values => callback(...values)); }
Надеюсь это поможет!
Ваше здоровье.