Нужно передать d в функцию но в консоле показывает пустое поле

'use strict';

 const functionsArr = [     
    () => new Promise((res) => setTimeout(res("JavaScript"), 500)),     
    () => new Promise((res) => setTimeout(res("is the best"), 250)),    
    () => new Promise((res) => setTimeout(res("programming language."), 150)), 
   ]; 
  const handler = arr => {   
     let a = arr[0](),
         b = arr[1](),
         c = arr[2](),
         d = '';

     a.then((prod) => {
        d += prod + ' ';
        return b;
     }).then((prod) => {
        d += prod + ' ';
        return c;
     }).then((prod) => {
        d += prod;
        console.log(d);
     });

     return new Promise(res => res(d));

  };
    
  handler(functionsArr).then((prod) => {
   console.log(prod); //JavaScript is the best programming language.  
  });

Ответы (1 шт):

Автор решения: Alexey Ten

Если править ваш код минимально, то его можно исправить например так:

  const handler = arr => {   
     let a = arr[0](),
         b = arr[1](),
         c = arr[2](),
         d = '';

     return a.then((prod) => {
        d += prod + ' ';
        return b;
     }).then((prod) => {
        d += prod + ' ';
        return c;
     }).then((prod) => {
        d += prod;
        return d;
     });
  };

Но на самом деле надо весь этот ужас выкинуть и написать одной строкой:

const handler = arr => Promise.all(arr.map(f => f())).then(a => a.join(' '));

Ну или если это слишком радикально, то честно расписать

const handler = async arr => {
    // запускаем все функции ...
    const promises = arr.map(f => f());
    // ... ждём их завершения ...
    const strings = await Promise.app(promises);
    // ... возвращаем строки склеенные через пробел
    return strings.join(' ');
}
→ Ссылка