隆Te damos la bienvenida a este reto!

1

隆Bienvenido al mundo de JavaScript!

D铆a 1

2

Variables, funciones y sintaxis b谩sica

3

Tipos de datos

4

Playground - Retorna el tipo

5

Tipos de datos - pt 2

D铆a 2

6

Operadores

7

Hoisting y coerci贸n

8

Playground - Calcula la propina

9

Alcance de las variables

D铆a 3

10

Condicionales

11

Playground - Calcula a帽os bisiestos

12

Switch

13

Playground - Obten informaci贸n de mascotas seg煤n su tipo

14

Ciclos

15

Playground - Dibuja un triangulo

D铆a 4

16

Arrays

17

Playground - Encuentra al michi mas famoso

18

Objetos

19

Playground - Obten el promedio de los estudiantes

D铆a 5 - Checkpoint

20

Playground - encuentra el palindromo m谩s grande

D铆a 6

21

Reasignaci贸n y redeclaraci贸n

22

Modo estricto

D铆a 7

23

Debugging y manejo de errores

24

Programaci贸n funcional

Quiz: D铆a 7

D铆a 8

25

Closures

26

Playground - Crea una calculadora con closures

27

Higher order functions

28

Playground - Crea tu propio m茅todo map

D铆a 9

29

ECMAScript

30

TC39

Quiz: D铆a 9

D铆a 10 - Checkpoint

31

ES6

32

ES7

33

Playground - Task planner

D铆a 11

34

Asincronismo

35

Playground - Promesas

36

Manejando el asincronismo

37

Playground - Resuelve el callback hell usando promesas

38

Playground - Resuelve el callback hell usando async/await

D铆a 12

39

Arrays a profundidad

40

M茅todos de arrays: Every, Find y findIndex

41

Playground - V谩lida el formulario

D铆a 13

42

M茅todos de arrays: Includes, Join y concat

43

Playground - agrupa los productos

44

M茅todos de arrays: Flat y FlatMap

45

Playground - Encuentra la ubicaci贸n del valor buscado

D铆a 14

46

Mutable functions

47

Playground - Modifica una lista de compras

48

M茅todos de arrays: sort

49

Playground - Ordena los productos

D铆a 15 - Checkpoint

50

Playground - Sistema de reservaciones de un hotel

D铆a 16

51

Programaci贸n orientada a objetos en JavaScript

52

Objetos literales

53

Playground - Congela el objeto recursivamente

D铆a 17

54

Prototipos en JavaScript

55

Playground - Modifica el prototype de los arrays

56

Playground - Crea un auto usando clases

D铆a 18

57

Abstracci贸n en JavaScript

58

Playground - Sistema de carrito de compras

59

Encapsulamiento en JavaScript

60

Playground - Encapsula datos de los usuarios

D铆a 19

61

Herencia en JavaScript

62

Playground - Jerarqu铆a de animales

63

Polimorfismo en JavaScript

64

Playground - Sistema de pagos

D铆a 20 - Checkpoint

65

Playground - Agenda de vuelos

D铆a 21

66

Patrones de dise帽o

67

Sinlgeton y Factory pattern en JavaScript

68

Playground - Implementa singleton en un chat

D铆a 22

69

Adapter y Decorator pattern en JavaScript

70

Playground - Personaliza productos de una tienda

71

Builder y Protype pattern en JavaScript

72

Playground - Mejora el c贸digo usando builder pattern

D铆a 23

73

Facade y proxy pattern en JavaScript

74

Playground - Proxy en servicio de mensajer铆a

75

Chain of responsability y Observer pattern en JavaScript

76

Playground - Implementaci贸n de Observador en Newsletter

D铆a 24 - Checkpoint

77

Playground - Crea un task manager con patrones de dise帽o

D铆a 25

78

Estructuras de datos en JavaScript

79

Playground - Crea tu propia implementaci贸n de un array

80

Hash tables en JavaScript

81

Playground - Implementaci贸n de una HashTable para Contactos

D铆a 26

82

Set en JavaScript

83

Playground - Remueve duplicados de una lista

84

Maps en JavaScript

85

Playground - Crea un organizador de tareas

D铆a 27

86

Singly Linked List en JavaScript

87

Playground - Agrega m茅todos a la singly linked list

88

Playground - Implementaci贸n de una singly linked list

D铆a 28

89

Stacks en JavaScript

90

Playground - Crea un stack para una playlist

D铆a 29

91

Queues en JavaScript

92

Playground - Crea una cola de emails

D铆a 30

93

隆Lo lograste!

Live Class

94

30 d铆as de JS con Juan DC

95

30 d铆as de JS con Nicobytes

96

30 d铆as de JS con GNDX

97

30 d铆as de JS con LeoCode

98

30 d铆as de JS con Teffcode

99

Sesi贸n: Cierre de los 30 d铆as de JavaScript

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende Ingl茅s, Programaci贸n, AI, Ciberseguridad y m谩s a precio especial.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

2 D铆as
0 Hrs
59 Min
53 Seg

Playground - Resuelve el callback hell usando promesas

37/99

Aportes 47

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

.
. -----------------------------------------
. ESCUDO ANTI SPOILER
. -----------------------------------------
.
. Este reto si que me hizo sudar.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

pues bien hay que modificar los dos archivos, no sean como yo que pensaba que solo era uno.

tasks.js

export function doTask1() {
  return new Promise((resolve, reject) =>
    (window.setTimeout(() => resolve('Task 1'), 300))
  );
}

export function doTask2() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve('Task 2'), 300)
  })
}

export function doTask3() {
  return new Promise((resolve, reject) => 
    (window.setTimeout(() => resolve('Task 3'), 300))
  )
}

solo le agregamos la promesa y el resolve

exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then(res => {
      strings.push(res)
      return doTask2();
    })
    .then(res => {
      strings.push(res)
      return doTask3();
    })
    .then(res => {
      strings.push(res)
      return strings
    })
    .catch(error => {
      console.log(error)
    });
}

ahora llamamos a las funciones en orden obtenemos las respuestas y retornamos hacia la sigueinte funcion.

MIREN QUE HAY 2 PESTA脩AS EN DONDE SE ESCRIBE EL C脫DIGO, PARA QUE LE ENTIENDAN AL DESAFIO.

No les vaya a pasar como a mi que me queria arrancar el cabello del estr茅s por no entender que ped铆a este reto JAJA.

Aqu铆 mi soluci贸n despu茅s de intentar quitarme la v1da:

tasks,js con sus funciones convertidos a Promise鈥檚

export function doTask1() {
  return new Promise((resolve) => { 
    window.setTimeout(() => resolve('Task 1'), 300);
  })
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}

Excercise.js leyendo las promesas y validando los resolves que retornan:

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then(result1 => {
      strings.push(result1);
      return doTask2()
    }).then(result1 => {
      strings.push(result1);
      return doTask3()
    }).then(result1 => {
      strings.push(result1);
      return strings;
    });
}

Probando cositas XD

Probando un metodo de las promesas Promise.all()

// task.js File

export async function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve("Task 1"), 300);
  });
}

export async function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve("Task 2"), 300);
  });
}

export async function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve("Task 3"), 300);
  });
}

// Excercise
import { doTask1, doTask2, doTask3 } from "./tasks";

export function runCode() {
  return Promise.all([doTask1(), doTask2(), doTask3()])
    .then((values) => {
      return values;
    })
    .catch((error) => {
      console.log(error);
    });
}

Primero que nada, noten que en este ejercicio hay dos archivos, por si les pasa como a m铆 que no entend铆a qu茅 hacia doTask1,doTask2 y doTask3 hasta que encontr茅 el archivo

Spoiler

Spoiler

Spoiler

Spoiler

Spoiler

exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];

  return doTask1()
    .then(function (rta1) {
      //Agrego la respuesta1 a strings y llamo a doTask2
      strings.push(rta1);
      return doTask2();
  })
    .then(function (rta2) {
      //Agrego la respuesta2 a strings y llamo a doTask3
      strings.push(rta2);
      return doTask3();
    })
    .then(function (rta3) {
      //Agrego la respuesta3 a strings y retorno strings
      strings.push(rta3);
      return strings;
    })
}

tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  })
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}

No tengo ni la mas remota idea de que hacer鈥

Mi soluci贸n con promise all: 馃

馃煝
馃煝
馃煝
馃煝
馃煝
馃煝
馃煝

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const tasksPromises = [doTask1(), doTask2(), doTask3()];
  return new Promise((resolve) => {
    Promise.all(tasksPromises)
      .then(tasks => resolve(tasks))
  })
}

Esto es un escudo anti-Spoiler
.
.
.
.

.
.
.

En mi opini贸n falto redactar un poco mejor las instrucciones, luego todo bien. Deben fijarse que hay un archivo tasks.js el cual pueden consultar. Inicialmente le preste mucha atenci贸n al exercise.js y no note hasta muy tarde el porque mi c贸digo estaba fallando. En fin suerte a todos 馃槂

NO MIRES ESO AMIGO

PERO SI INSISTES

function runCode() {
    const strings = [];
    return new Promise((resolve) => {
        /* doTask1((rta1) => {
            strings.push(rta1);
            doTask2((rta2) => {
                strings.push(rta2);
                doTask3((rta3) => {
                    strings.push(rta3);
                    resolve(strings);
                })
            })
        }) */
        doTask1()
            .then(response => {
                strings.push(response)
                return doTask2(); //llama a la siguiente promesa para que se ejecute
            })
            .then(response => { //response hace referencia al valor de respuesta de la promesa doTask2()
                strings.push(response)
                return doTask3(); //llama a la siguiente promesa para que se ejecute
            })
            .then(response => { //response hace referencia al valor de respuesta de la promesa doTask3()
                strings.push(response)
                return resolve(strings) //retorna el arreglo de strings
            })
    })
}

Hice el cambio en el archivo tasks.js y me acept贸 las pruebas 馃槄

Soluci贸n! 馃槃

馃洝锔忦煕★笍馃洝锔廍scudo anti spoilers馃洝锔忦煕★笍馃洝锔

Callback hell

function doTask1() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("Task 1"), 300);
  });
}

function doTask2() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("Task 2"), 300);
  });
}

function doTask3() {
  return new Promise((resolve) => {
    setTimeout(() => resolve("Task 3"), 300);
  });
}
export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
      .then((result) => {
        strings.push(result);
        return doTask2();
      })
      .then((result) => {
        strings.push(result);
        return doTask3();
      })
      .then((result) => {
        strings.push(result);
        resolve(strings);
      });
  });
}

tasks.js

export function doTask1(callback) { 
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  });
}

export function doTask2(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  });
}

export function doTask3(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  });
}

excercise,js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1().then(res => {
    strings.push(res);
    return doTask2();
  }).then(res2 => {
    strings.push(res2);
    return doTask3();
  }).then(res3 => {
    strings.push(res3);
    return strings;
  })
}


.
.
.
.
.
.

exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
    const strings = [];
    return doTask1()
      .then(rta => {
        strings.push(rta);
        return doTask2();
      })
      .then(rta => {
        strings.push(rta);
        return doTask3();
      })
      .then(rta => {
        strings.push(rta);
        return strings;
      })
}

tasks.js

export function doTask1() {
    return new Promise((resolve) => {
        window.setTimeout(() => resolve('Task 1'), 300);
    })
  }
  
export function doTask2() {
    return new Promise((resolve) => {
        window.setTimeout(() => resolve('Task 2'), 300);
    })
}
  
export function doTask3() {
    return new Promise((resolve) => {
        window.setTimeout(() => resolve('Task 3'), 300);
    })
}

part1

export function doTask1() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => {
      resolve('Task 1');
    }, 300);
  });
}

export function doTask2() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => {
      resolve('Task 2');
    }, 300);
  });
}

export function doTask3() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => {
      resolve('Task 3');
    }, 300);
  });
}

part2

export function runCode() {
  const strings = [];
  return doTask1()
    .then(data1 => {
      strings.push(data1);
      return doTask2();
    })
    .then(data2 => {
      strings.push(data2);
      return doTask3();
    })
    .then(data3 => {
      strings.push(data3);
      return strings;
    })
}

Comparto mi soluci贸n:

.
.
,
.
.

.
.
,
.
.

tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  });
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  });
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  });
}

exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1().then(rta1 => {
    strings.push(rta1);
    return doTask2();
  }).then(rta2 => {
    strings.push(rta2);
    return doTask3();
  }).then(rta3 => {
    strings.push(rta3);
    return strings;
  });
}


Mi soluci贸n:

Archivo exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1().then(result1 => {
    strings.push(result1);
    return doTask2(result1);
  })
    .then(result2 => {
      strings.push(result2);
      return doTask3(result2);

    })
    .then(result3 => {
      strings.push(result3);
      return strings;
    })
}

Archivo task.js

export function doTask1(callback) {
  return new Promise((resolve) => {
    window.setTimeout(resolve('Task 1'), 300);
  })
}

export function doTask2(callback) {
  return new Promise((resolve) => {
    window.setTimeout(resolve('Task 2'), 300);
  })
}

export function doTask3(callback) {
  return new Promise((resolve) => {
    window.setTimeout(resolve('Task 3'), 300);
  })
}
 

馃懢 Mi soluci贸n

馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀
馃毀

tasks.js

export function doTask1() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve("Task 1"), 300);
  });
}

export function doTask2() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve("Task 2"), 300);
  });
}

export function doTask3() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve("Task 3"), 300);
  });
}

exercise.js

export function runCode() {
  const strings = [];
  return doTask1()
    .then((response) => {
      strings.push(response);
      return doTask2();
    })
    .then((response) => {
      strings.push(response);
      return doTask3();
    })
    .then((response) => {
      strings.push(response);
      return strings;
    });
}
import { doTask1, doTask2, doTask3 } from './tasks';

export const runCode = () => {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
      .then(rta1 => { 
        strings.push(rta1);
        return doTask2() 
      })
      .then(rta2 => {
        strings.push(rta2);
        return doTask3()
      })
      .then(rta3 => {
        strings.push(rta3);
        console.log(strings);
        resolve(strings);
      })
  })
}
export const doTask1 = () => new Promise(resolve => window.setTimeout(() => resolve('Task 1'), 300));

export const doTask2 = () => new Promise(resolve => window.setTimeout(() => resolve('Task 2'), 300));

export const doTask3 = () => new Promise(resolve => window.setTimeout(() => resolve('Task 3'), 300));

Hola Comparto mi soluci贸n al Reto:

馃殫
馃殦
馃殨
馃浐
馃殭
馃殞
馃殣
馃殠
馃殤
馃殥
馃殮
馃殯

tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve("Task 1"), 300);
  });
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve("Task 2"), 300);
  });
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve("Task 3"), 300);
  });
}

exercise.js

import { doTask1, doTask2, doTask3 } from "./tasks";

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
      .then((rta1) => {
        strings.push(rta1);
        return doTask2();
      })
      .then((rta2) => {
        strings.push(rta2);
        return doTask3();
      })
      .then((rta3) => {
        strings.push(rta3);
        resolve(strings);
      });
  });
}

Hi,people.
Iniciamos refactorizando las funciones callback, a promesas, Una a una :
Seguidamente refactorizamos el c贸digo del ejercicio, retornando cada una de las promesas, y seguidamente llamando su resolve, con el .then(), dentro de este then viene la rest1, la pasamos como argumento y en el cuerpo { empujamos} la respuesta al string con el .push. y seguidamente retornamos la siguiente promesa o doTask2 y volvemos a hacer lo mismo, En el ultimo .then(), retornamos el string completo.

            return new Promise((resolve) => {
                window.setTimeout(() => resolve('Task 1'), 300);
            });

        }

        function doTask2() {
            return new Promise((resolve) => {
                window.setTimeout(() => resolve('Task 2'), 300);
            });

        }

        function doTask3() {
            return new Promise((resolve) => {
                window.setTimeout(() => resolve('Task 3'), 300);
            });

        }

        function runCode() {
            const strings = [];
            return doTask1()
                .then((rest1) => {
                    strings.push(rest1);
                    return doTask2();
                })
                .then((rest2) => {
                    strings.push(rest2);
                    return doTask3();
                })
                .then((rest3) => {
                    strings.push(rest3);
                    return strings;
                }) 

.
solucion
.

task.js

const doTaskSync = ((task) => {
  return new Promise((resolve) =>
    window.setTimeout(() => resolve(task), 300)
  )
})

export function doTask1() {
  return doTaskSync('Task 1')
}

export function doTask2() {
  return doTaskSync('Task 2')
}

export function doTask3() {
  return doTaskSync('Task 3')
}

exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then((rta1) => {
      strings.push(rta1);
      return doTask2()
    })
    .then((rta2) => {
      strings.push(rta2);
      return doTask3()
    })
    .then((rta3) => {
      strings.push(rta3);
      return strings
    })
}

隆Hola!

Mi soluci贸n,
Se detalla hasta abajo.猬











exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return  doTask1()
    .then(result1 => {
      strings.push(result1);
      return  doTask2(result1);
    })
    .then(result2 => {
      strings.push(result2);
      return  doTask3(result2);
    })
    .then(result3 => {
      strings.push(result3);
      return strings;
    });

}

task.js

export function doTask1(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  })
}

export function doTask2(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })
}

export function doTask3(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
asi lo resolvi:

import { doTask1, doTask2, doTask3 } from 鈥./tasks鈥;

export function runCode() {
const strings = [];
return doTask1().then(r => { console.log庐; strings.push庐; return doTask2()})
.then(r => { console.log庐; strings.push庐; return doTask3() })
.then(r => { console.log庐; strings.push庐; console.log(strings); return strings})
//doTask2().then(r => strings.push庐);
//doTask3().then(r => strings.push庐);

}

con las clases, la ayuda de la comunidad mas prueba y error en la plataforma poco a poco se va interiorizando estos conceptos. son un poco contra intuitivos

Cuidado Spoiler
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

*
*
No se si el uso del m茅todo Promise.all() estaba permitido, pero estoy intentando resolver los retos 煤nicamente bas谩ndome en lo s茅 de JS. Dejo el gist con mi respuesta al reto

馃洝锔廍scudo anti-spoilers馃洝锔
.
.

鈥淢i soluci贸n鈥, basada en las soluciones de la comunidad, este tema es nuevo para mi 馃槂 Happy to learn!!

task.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  })
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}

exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then(result1 => {
      strings.push(result1);
      return doTask2();
    })
    .then(result2 => {
      strings.push(result2);
      return doTask3();
    })
    .then(result3 => {
      strings.push(result3);
      return strings;
    })
}

Hola. Muy buen reto este!. Puso a loquear un rato jaja. Ch茅vere el aumento de dificultad que est谩n poniendo
.
.
.
Comparto mi soluci贸n
.
.
.
.
Por ahora lo entiendo as铆: .then() es un manejador de 鈥榦utcomes鈥 que funciona si la funci贸n anterior de la cadena (el primer doTask() u otro then()) retorna un objeto tipo Promesa. As铆 se siente obligado a esperar. Si la funci贸n anterior no tiene return; el then() coge un 鈥榰ndefined鈥 como la siguiente response y sigue derecho.
.
Entonces al doTask1() le concateno un then() que espera el return de la Promise dentro de la definici贸n de doTask1(). Esto se le alimenta al then(), ejecuta el push, para luego ejecutar y retornar la otra Promesa. Este ciclo se repite para los dem谩s. La diferencia est谩 en que el 煤ltimo then() no retorna para otro then() sino para la Promise principal, y le pasa el strings[] como resolve()

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1().then(response => {
      strings.push(response);
      return doTask2();
    })
    .then(response => {
      strings.push(response);
      return doTask3();
    })
    .then(response => {
      strings.push(response)
    })
    .then(() => { return resolve(strings) })
  })
}

Envolver el setTimeout() en una promesa es insertarlo como cuerpo de la funci贸n 鈥榩rometida鈥 en la Promesa. Como es una sola l铆nea, el return es autom谩tico. S铆 toca hacerle return a la promesa como tal para que pueda ser manejada por un then() posterior.

export function doTask1() {
  return new Promise((resolve) => { window.setTimeout(() => resolve('Task 1'), 300) });
}

export function doTask2() {
  return new Promise((resolve) => { window.setTimeout(() => resolve('Task 2'), 300) });
}

export function doTask3() {
  return new Promise((resolve) => window.setTimeout(() => resolve('Task 3'), 300));
}

Poco c贸digo pero te puedes enredar鈥 馃槂

Tasks.js

export  function doTask1(callback) {

  return new Promise((resolve)=>{
    setTimeout(() => {resolve(callback('Task 1'))}, 300);
  });
  }
  
  export function doTask2(callback) {
    return new Promise((resolve)=>{
      setTimeout(() => {resolve(callback('Task 2'))}, 300);
    });
  }
  
  export function doTask3(callback) {
    return new Promise((resolve)=>{
      setTimeout(() =>{ resolve(callback('Task 3'))}, 300);
    });
  }

exercise.js

function runCode() {
    const strings = [];

return new Promise((resolve)=>{
   doTask1(arg=> strings.push(arg))
   .then(data=>doTask2(arg2=> strings.push(arg2)))
   .then(data=> doTask3(arg3=> strings.push(arg3)))
   .then(data=>resolve(strings));
   ;
   
})
}

Soluci贸n

function doTask1() {
	return new Promise(resolve => {
  	window.setTimeout(() => resolve("Task 1"), 300)
  })
}

function doTask2() {
	return new Promise(resolve => {
  	window.setTimeout(() => resolve("Task 2"), 300)
  })
}

function doTask3() {
	return new Promise(resolve => {
  	window.setTimeout(() => resolve("Task 3"), 300)
  })
}


function runCode() {
  const strings = [];
  return new Promise((resolve) => {
  	doTask1()
    	.then(str => {
      	strings.push(str)
      })
    doTask2()
    	.then(str => {
      	strings.push(str)
      })
    doTask3()
    	.then(str => {
      	strings.push(str)
      	resolve(strings)
      })
  })
}

Tasks.js

export const doTask1 = () => new Promise((resolve, reject) => window.setTimeout(() => resolve('Task 1'), 300));

export const doTask2 = () => new Promise((resolve, reject) => window.setTimeout(() => resolve('Task 2'), 300));

export const doTask3 = () => new Promise((resolve, reject) => window.setTimeout(() => resolve('Task 3'), 300));

Exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1().
    then(result => {
      strings.push(result);
      return doTask2();
    })
    .then(result => {
      strings.push(result);
      return doTask3();
    })
    .then(result => {
      strings.push(result);
      return strings
    })
}

Segun vi, el truco esta en que el Promise se hace sobre el tasks.js y no sobre el exercise.js

Mi soluci贸n:
exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return (
    doTask1()
      .then((rta1) => {
      strings.push(rta1);
      return doTask2()
      })
      .then((rta2) => {
        strings.push(rta2);
        return doTask3()
      })
      .then((rta3) => {
        strings.push(rta3);
         return strings;
      })
  )
}

tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => {resolve("Task 1")}, 300);
  })
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => {resolve("Task 2")}, 300);
  })
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => {resolve("Task 3")}, 300);
  })
}

Respuesta al ejercicio, cuidado con los spoilers:
.
.
.
.
.
.
.
.
.
.
.
Al parecer me paso lo mismo que a mucha gente de los comentarios y es que trate de resolver el problema solo con exercise.js, ya despu茅s descubr铆 que tambi茅n hay que resolver tasks.js

exercise.js:

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
    .then(rta1 => {
      strings.push(rta1);
      return doTask2();
    })
    .then(rta2 => {
      strings.push(rta2);
      return doTask3();
    })
    .then(rta3 => {
      strings.push(rta3);
      resolve(strings);
    })
  });
}

tasks.js

export function doTask1() {
  return new Promise(response => {
    window.setTimeout(() => response('Task 1'), 300);
  })
}

export function doTask2() {
  return new Promise(response => {
    window.setTimeout(() => response('Task 2'), 300);
  })
}

export function doTask3() {
  return new Promise(response => {
    window.setTimeout(() => response('Task 3'), 300);
  })
}

Mi respuesta al ejercicio:
.
.
.
.
.
.
.
.
.
.
.
.
.

//Archivo tasks.js
export function doTask1() {
  return new Promise(resolve => window.setTimeout(() => resolve('Task 1'), 300));
}

export function doTask2() {
  return new Promise(resolve => window.setTimeout(() => resolve('Task 2'), 300));
}

export function doTask3() {
  return new Promise(resolve => window.setTimeout(() => resolve('Task 3'), 300));
}
//Mi solucion
import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];

  return doTask1()
    .then(response => strings.push(response))
    .then(() => doTask2())
    .then(response => strings.push(response))
    .then(() => doTask3())
    .then(response => strings.push(response))
    .then(() => strings);
}

Ya estuvo, algo complicado, creo que me falta entender mucho m谩s esto, pero es muy interesante y divertido

excercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
      .then(rta1 => {
        strings.push(rta1);
        return doTask2();
      })
      .then(rta2 => {
        strings.push(rta2);
        return doTask3();
      })
      .then(rta3 => {
        strings.push(rta3);
        resolve(strings);
      })
      .catch(error => {
        console.log(error);
      });
  });
}

tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  });
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  });
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}

exercise.js

tasks.js

Sufri un poco porque no me di cuenta de la pesta帽a tasks.js, que se ten铆a que hacer cambios, para que funcione.

.
.
.
.
.
.
.
tasks.js

export function doTask1() {
  return new Promise((resolve, reject) =>{
    window.setTimeout(() => resolve('Task 1'), 300);  
  })  
}

export function doTask2() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })  
}

export function doTask3() {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}


import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then(rta1 => {
      strings.push(rta1)
      return doTask2()
    })
    .then(rta2 => {
      strings.push(rta2)
      return doTask3()    
    })
    .then(rta3 => {
      strings.push(rta3)
      return strings
    })
  
}

vaya no pude a la primera, tube que spoilearme 馃槮

UUUUffffff, me hizo sufrir mas que la t贸xica jajajaj, pero se pudo:

aqu铆 las tasks.js convertidos a promesas:

<export function doTask1() {
  return new Promise(resolve => {
    window.setTimeout(() => resolve('Task 1'), 300);
  });
}
export function doTask2() {
  return new Promise(resolve => {
    window.setTimeout(() => resolve('Task 2'), 300);
  });
}
export function doTask3() {
  return new Promise(resolve => {
    window.setTimeout(() => resolve('Task 3'), 300);
  });
}> 

Y aqu铆 en runCode:

<import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then(rta1 => {
      strings.push(rta1);
      return doTask2();
    })
    .then(rta2 => {
      strings.push(rta2);
      return doTask3();
    })
    .then(rta3 => {
      strings.push(rta3);
      return strings;
    });
}> 

me encant贸 este reto.

MI SOLUCION 馃挭
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Me tomo un tiempo darme cuenta de que hab铆a un archivo tasks.js

export function doTask1(callback) {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve('Task 1'), 300)
  });
}

export function doTask2(callback) {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve('Task 2'), 300)
  });
}

export function doTask3(callback) {
  return new Promise((resolve, reject) => {
    window.setTimeout(() => resolve('Task 3'), 300)
  });
}

Una vez modificado el archivo tasks.js el otro ya es mas sencillo es solo ponerlos then y retornar la siguiente tarea

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return doTask1()
    .then(responce1 => {
      strings.push(responce1);
      return doTask2();
    })
    .then(responce2 => {
      strings.push(responce2);
      return doTask3();
    })
    .then(responce3 => {
      strings.push(responce3);
      return strings;
    })
    .catch(err => console.error(err));
}

Solucion al reto
.
.
.
.
.
.
.
.
.
.
.
.

In tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  })
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
}

In exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
      .then(task1 => {
        strings.push(task1);
        return doTask2();
      })
      .then(task2 => {
        strings.push(task2);
        return doTask3();
      })
      .then(task3 => {
        strings.push(task3);
        resolve(strings)
      })
      .catch((err) => console.error(err));
  })
}

Para entender mejor los callback, aqu铆 hay un ejemplo similar al ejercicio del reto:
.
tasks.js
.

export function sum(x, y, callback) {
  window.setTimeout(() => {
    const result = x + y;
    callback(result);
  }, 300);
}

export function multiply(x, y, callback) {
  window.setTimeout(() => {
    const result = x * y;
    callback(result);
  }, 300);
}

export function subtract(x, y, callback) {
  window.setTimeout(() => {
    const result = x - y;
    callback(result);
  }, 300);
}

.
excercise.js:
.

import { sum, multiply, subtract } from './tasks';

export function runCode() {
  return new Promise((resolve) => {
    sum(2, 3, (result) => {
      console.log('La suma de 2 y 3 es:', result);
      multiply(4, 5, (result) => {
        console.log('La multiplicaci贸n de 4 y 5 es:', result);
        subtract(10, 3, (result) => {
          console.log('La resta de 10 y 3 es:', result);
          resolve();
        });
      });
    });
  });
}

Soluci贸n鈥 馃槃
.
Me cost贸 entenderlo鈥
.
Primero hay que analizar como funciona el c贸digo de runCode() original:
.

const strings = [];
  return new Promise((resolve) => {
    doTask1((rta1) => {
      strings.push(rta1);
      doTask2((rta2) => {
        strings.push(rta2);
        doTask3((rta3) => {
          strings.push(rta3);
          resolve(strings);
        })
      })
    })
  })

.
Se tiene al arreglo strings, que guardar谩 los tasks correspondientes. Por lo que primero en el return, se crea una promesa y adentro se llama a la funci贸n doTask1, que es el siguiente:
.

export function doTask1(callback) {
  window.setTimeout(() => callback('Task 1'), 300);
}

.
En esta funci贸n lo que estamos pasando es una funci贸n llamada callback. Dentro de doTask1(callback) tenemos un setTimeout de 300 milisegundos.
.
Despu茅s de ese tiempo se realiza 鈥榗allback(鈥楾ask 1鈥)鈥; es decir, 鈥楾ask 1鈥 ser谩 igual a 鈥榬ta1鈥 en excercise.js:
.

 doTask1((rta1) => {
      strings.push(rta1);
      doTask2((rta2) => {  //etc.. 

.
Por lo que, podr铆a entenderse como si fuera:
.

 doTask1((rta1) => { //rta1 = 'task 1'
      strings.push(rta1);
      doTask2((rta2) => {  //etc

.
Entonces estamos agregando 鈥榯ask 1鈥 al array de tareas 鈥榮trings鈥, y luego hacemos el mismo proces con 鈥榙oTask2鈥 y 鈥榙oTask3鈥.
.
Este 煤ltimo resuelve el array de tareas mediante 鈥榬esolve鈥.
.
Ya en la resoluci贸n del reto, convertimos las funciones del archivo tasks.js a promesas, como por ejemplo:
.

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => {
      resolve('Task 1');
    }, 300);
  });
}

.
Luego en exercise, retornamos doTask1() anidado a los .then(). Esto porque la funci贸n then() se utiliza para manejar la promesa que devuelve la funci贸n anterior.
.
Por lo cual doTask() resolver谩 鈥楾ask 1鈥 que tomar谩 el valor de 鈥榬ta1鈥 en el .then((rta1) => //etc鈥).
.
Se agrega 鈥楾ask 1鈥 al array de tareas y se retorna doTask2 () que resolver谩 鈥楾ask 2鈥 que tomar谩 el valor de 鈥榬ta2鈥, y el mismo proceso con doTask3() y rta3, retornando al final el array de tareas 鈥榮trings鈥.
.
exercise.js:

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];

  return doTask1()
    .then((rta1) => {
      strings.push(rta1);
      return doTask2();
    })
    .then((rta2) => {
      strings.push(rta2);
      return doTask3();
    })
    .then((rta3) => { 
      strings.push(rta3);
      return strings;
    });
} 

.
tasks.js:
.

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => {
      resolve('Task 1');
    }, 300);
  });
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => {
      resolve('Task 2');
    }, 300);
  });
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => {
      resolve('Task 3');
    }, 300);
  });
} 

.
.
.
.
.
.
.
.
.
.
.

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1().then(rta1 => {
      strings.push(rta1);
      return doTask2();
    }).then(rta2 => {
      strings.push(rta2);
      return doTask3();
    }).then(rta3 => {
      strings.push(rta3);
      resolve(strings);
    }).catch(error => {
      console.log(error);
    })
  })
}
export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  })
  
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  })
  
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  })
  

Soluci贸n

File exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';

export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
      .then(rta1 => {
        strings.push(rta1);
        return doTask2();
      })
      .then(rta2 => {
        strings.push(rta2);
        return doTask3();
      })
      .then(rta3 => {
        strings.push(rta3);
        resolve(strings);
      });
  })
}

File tasks.js

export function doTask1(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  });
}

export function doTask2(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  });
}

export function doTask3(callback) {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  });
}

Archivo exercise.js

import { doTask1, doTask2, doTask3 } from './tasks';
export function runCode() {
  const strings = [];
  return new Promise((resolve) => {
    doTask1()
    .then(rta1 => {
      strings.push(rta1);
      return doTask2();
    })
    .then(rta2 => {
      strings.push(rta2);
      return doTask3()
    })
    .then(rta3=>{
      strings.push(rta3);
      resolve(strings);
    })
  })
}

Archivo tasks.js

export function doTask1() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 1'), 300);
  })
}

export function doTask2() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 2'), 300);
  });
}

export function doTask3() {
  return new Promise((resolve) => {
    window.setTimeout(() => resolve('Task 3'), 300);
  });
}

Hola, dejo mi solucion
Caminito anti spoilers
馃殫
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Llegamos 馃搷

Task.js

export function doTask1(callback) {
return new Promise((resolve, reject) => {
window.setTimeout(() => {
resolve(鈥楾ask 1鈥)
}, 300)
})
}

export function doTask2(callback) {
return new Promise((resolve, reject) => {
window.setTimeout(() => {
resolve(鈥楾ask 2鈥)
}, 300)
})
}

export function doTask3(callback) {
return new Promise((resolve, reject) => {
window.setTimeout(() => {
resolve(鈥楾ask 3鈥)
}, 300)
})
}
exercise.js

import { doTask1, doTask2, doTask3 } from 鈥./tasks鈥;

export function runCode() {
const strings = [];
return doTask1()
.then(function (respuesta1) {
strings.push(respuesta1);
return doTask2();
})
.then(function (respuesta2) {
strings.push(respuesta2);
return doTask3();
})
.then(function (respuesta3) {
strings.push(respuesta3);
return strings;
})
}

undefined