Ответ 1
ES2015 promises никогда не будет прогрессировать. promises представляют собой единственное конечное значение. Если вам нужны несколько значений, вы можете посмотреть на наблюдаемые - или поместить прогресс в функцию возврата обещаний.
Постановка прогресса на функцию возврата обещания довольно проста. В основном вы принимаете обратный вызов в качестве параметра функции и вызываете его всякий раз, когда должно появляться уведомление о ходе выполнения.
Вот текст, адаптированный из нашего руководства в bluebird:
Progression имеет проблемы с возможностью компоновки и цепочки с API-интерфейсами, в которых используются обработчики перспективных обработчиков. Поскольку другие библиотеки удаляются от API прогрессии, поскольку он действительно имеет мало общего с promises, так и Bluebird. Реализация общего варианта использования индикаторов выполнения может быть выполнена с использованием шаблона, аналогичного IProgress на С#.
Использование jQuery перед:
Promise.resolve($.get(...))
.progressed(function() {
// ...
})
.then(function() {
// ...
})
.catch(function(e) {
// ...
})
Использование jQuery после:
Promise.resolve($.get(...).progress(function() {
// ...
}))
.then(function() {
// ...
})
.catch(function(e) {
// ...
})
Реализация общих интерфейсов прогресса, таких как С#:
function returnsPromiseWithProgress(progressHandler) {
return doFirstAction().tap(function() {
progressHandler(0.33);
}).then(doSecondAction).tap(function() {
progressHandler(0.66);
}).then(doThirdAction).tap(function() {
progressHandler(1.00);
});
}
returnsPromiseWithProgress(function(progress) {
ui.progressbar.setWidth((progress * 200) + "px"); // update with on client side
}).then(function(value) { // action complete
// entire chain is complete.
}).catch(function(e) {
// error
});