Я прочитал спецификацию Promise/A + и в разделе 2.2.4:
onFulfilled или onRejected не должны вызываться, пока стек контекста выполнения не содержит только код платформы
Но в Firefox (я тестировал 38.2.1 ESR и 40.0.3) следующий script синхронно выполняет синхронный метод onFulfilled:
var p = Promise.resolve("Second");
p.then(alert);
alert("First");
(Кажется, он не запускается с помощью предупреждений, здесь также можно попробовать: http://jsbin.com/yovemaweye/1/edit?js,output)
Он работает так, как ожидалось, в других браузерах или при использовании ES6Promise- Polyfill.
Я что-то пропустил? Я всегда, хотя одна из точек тогда-метода заключается в обеспечении асинхронного выполнения.
Изменить:
Он работает при использовании console.log, см. ответ Benjamin Gruenbaum:
function output(sMessage) {
  console.log(sMessage);
}
var p = Promise.resolve("Second");
p.then(output);
output("First");
Как он замечает в комментариях, это также происходит при использовании синхронных запросов, и именно поэтому это происходит в вашем тестовом сценарии. Я создал минимальный пример того, что происходит в наших тестах:
function request(bAsync) {
  return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.addEventListener("readystatechange", function() {
      if (xhr.readyState === XMLHttpRequest.DONE) {
        resolve(xhr.responseText);
      }
    });
    xhr.open("GET", "https://sapui5.hana.ondemand.com/sdk/resources/sap-ui-core.js", !!bAsync);
    xhr.send();
  });
}
function output(sMessage, bError) {
  var oMessage = document.createElement("div");
  if (bError) {
    oMessage.style.color = "red";
  }
  oMessage.appendChild(document.createTextNode(sMessage));
  document.body.appendChild(oMessage);
}
var sSyncData = null;
var sAsyncData = null;
request(true).then(function(sData) {
  sAsyncData = sData;
  output("Async data received");
});
request(false).then(function(sData) {
  sSyncData = sData;
  output("Sync data received");
});
// Tests
if (sSyncData === null) {
  output("Sync data as expected");
} else {
  output("Unexpected sync data", true);
}
if (sAsyncData === null) {
  output("Async data as expected");
} else {
  output("Unexpected async data", true);
}