Asynchroniczny kod z callbackami w JavaScript

Załóżmy, że mamy pewną asynchroniczną funkcję:

javascriptfunction make() {
  setTimeout(function() {
    console.log('1');
  }, 3000);
}

Załóżmy, że używamy tej funkcji w następujący sposób:

javascriptmake();
console.log('2'); // wykona się pierwsze

Załóżmy, że chcemy, aby drugie wypisanie do konsoli wykonało się po tym, jak wykona się operacja asynchroniczna wewnątrz funkcji. Jednym z podejść używanych do tego, jest użycie callbacka: opakowujemy oczekujący kod w funkcję anonimową i przekazujemy parametrem do funkcji make:

javascriptmake(function() {
  console.log('2');
});

Oczywiście, samo w sobie to nie rozwiąże naszego problemu. Na razie po prostu przyjęliśmy następującą konwencję: jeśli chcesz wykonać kod po wywołaniu make, przekaj ten kod callbackiem w wywołaniu make.

Poprawmy kod funkcji make tak, aby zaczęła działać zgodnie z naszą konwencją:

javascriptfunction make(callback) {
  setTimeout(function() {
    console.log('1'); // jakaś operacja asynchroniczna, może nie jedna
    callback();       // potem nasz callback
  }, 3000);
}
Задание 1

Opowiedz, w jakiej kolejności wypiszą się liczby w konsoli:

javascriptfunction make(callback) {
  setTimeout(function() {
    console.log('1');
    callback();
  }, 3000);
}

make(function() {
  console.log('2');
  console.log('3');
});