Уведомления о ходе работы в ECMAScript Promise

Мы используем ECMAScript 6 promises.

Нам нужно внедрить уведомления о выполнении для конечного пользователя (это чистое требование UX). Я знаю, что другие рамки обещаний (библиотека Q promise, например,) позволяют это.

Как мы можем принять какой-то показатель прогресса наиболее элегантно?

Или мы должны переносить в другую структуру? (Я не знаю, как оценить усилия последнего)

Ответы

Ответ 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
});