Показать сообщение отдельно
  #2 (permalink)  
Старый 27.12.2014, 13:12
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Я так понял, тут вот о чем:

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.

Кто из них прав, я понять так и не смог.
Ответить с цитированием