Ответ 1
Это потому, что then
не ожидает другого обещания в качестве аргумента. Скорее, он ожидает функций обработчика, обратного вызова и/или ошибочного сообщения, которое вы передаете во втором примере. Действительно, любой аргумент, который не является функцией, просто игнорируется.
Если вы вернете значение в обработчике, outputPromise будет выполнен.
Если вы выбрали исключение в обработчике, outputPromise будет отклонен.
Если вы вернете обещание в обработчике, outputPromise "станет" этим обещанием. Возможность стать новым обещанием полезна для управления задержками, объединения результатов или восстановления от ошибок.
Итак, да, цепочка promises может быть выполнена. Вы делаете это правильно во втором примере.
Возможно, что надуманный пример прохождения пройденного promises делает способ работы цепочки promises показаться чрезмерно подробным, но в реальном мире вы обычно связываете promises, потому что вас интересуют их возвращаемые значения, например:
somethingAsync().then(function (n) {
return somethingElseAsync(n);
})
.then(function (n) {
return somethingElseAsync(n);
})
.then(function (result) {
// ...
})
(На самом деле это зеркалирует async.waterfall
. Если вы просто хотели вызвать серию асинхронных функций, чтобы не отнестись к их результатам, вы можете использовать async.series
)