Я так понял, тут вот о чем:
var y = {
then: function (resolvePromise) {
console.log("y.then()");
resolvePromise('y1');
}
};
var x = {
then: function (resolvePromise) {
console.log("x.then()");
resolvePromise(y);
}
};
var pro = new Promise(function (resolve) {
console.log("Promise: resolve(x);");
resolve(x);
});
pro.then(function (value) {
console.log('value =', value);
});
"х" - просто thenable, его в 17 строке передаем в resolve.
А "y" - thenable for a thenable, потому что его передаем в resolvePromise внутри x.then.
Передача thenable в resolve/resolvePromise приводит к тому, что у этих объектов вызывается then, чтобы узнать итоговое значение всего промиса (в то время как не-thenable объект сам пошел бы в качестве значения. Т.е. в итоговое значение промиса никак нельзя передать объект с методом then).
И вот тут обнаружилось разное поведение в Хроме и Fx, которое видно, если pro.then поместить в setTimeout:
Fx "прокручивает" все then во время resolve промиса (строка 17), а Хром - в момент вызова pro.then.
Кто из них прав, я понять так и не смог.