Qual é a diferença entre "fila de loop de eventos" e "fila de tarefas"?

Não consigo entender como o código a seguir é executado. Por que "1" é depois de "b", mas "h" é depois de "3"? A ordem não deveria ser: a, b, 1, 2, h, 3? Algum artigo disse que a diferença entre "fila de loop de eventos" e "fila de tarefas" leva à saída seguinte. Mas como? Eu li a especificação deECMAScript 2015 - 8.4 Trabalhos e filas de trabalhos, querendo saber como o Promise'job funciona, mas isso me deixa mais confuso. Alguém pode me ajudar? Obrigado!

var promise = new Promise(function(resolve, reject) {resolve(1)});
promise.then(function(resolve) {console.log(1)});
console.log('a');
promise.then(function(resolve) {console.log(2);});
setTimeout(function() {console.log('h')}, 0);
promise.then(function(resolve) {console.log(3)});
console.log('b');

// a
// b
// 1
// 2
// 3
// h

Sei que o Promise é assíncrono, mas o retorno de chamada da operação assíncrona setTimeout (..) é sempre após a operação assíncrona do Promise. Por quê?

questionAnswers(3)

yourAnswerToTheQuestion