JQuery, зависимый от цепочки, отложенный с прогрессом, неудачей, а затем - PullRequest
0 голосов
/ 14 марта 2019

Я несколько новичок в обещаниях js и работаю на устаревшей системе, использующей jQuery 1.7.1, пытаясь устранить некоторые ошибки в обратных вызовах, похоже, я создаю новый.Заранее благодарим за помощь!

  1. Созданы утилиты для доступа к сервису webapi через ajax.Я использую jQuery Deferred () вместо new Promise () , но в конце я возвращаю Promise , который при успехе / ошибке разрешается /отклонено.

    var Utils = (function () {
    // private
    var _timeout = 3000;
    // ...
    
    // public
    return {
        getHeartBeat: function(id) {
            var deferred = $.Deferred();
            deferred.notify('Getting a heartbeat ... ' + id);
            $.ajax({
                url: URLS.getHeartBeat,
                type: 'GET',
                contentType: "application/json; charset=utf-8",
                success: function (data, textStatus, jqXHR) {
                    deferred.resolve(id, data);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    deferred.reject(id, makeError(jqXHR, textStatus, errorThrown));
                },
                timeout: _timeout
            });
            return deferred.promise();
        }
    };
    // ...
    

    }) ();

  2. Необходимо запросить новое сердцебиение ПОСЛЕ завершения предыдущего:

    function testHeartBeatChaining () {

    PersoUtils.getHearthBeat(1)
    // Hearthbeat 1
    .progress(function(msg) {
        console.log(msg);
    })
    .fail(function(id, err) {
        console.log('ERROR while getting beat' + id + ' : ' + err);
    })
    .then(function(id, beat) {
        console.log('got beat ' + id + ': ' + JSON.stringify(beat));
        return PersoUtils.getHearthBeat(2); // new value, say depending on 'beat'
    })
     // Hearthbeat 2
    .progress(function(msg) {
        console.log(msg);
    })
    .fail(function(id, err) {
        console.log('ERROR while getting beat' + id + ' : ' + err);
    })
    .then(function(id, beat) {
        console.log('got beat ' + id + ': ' + JSON.stringify(beat));
        return PersoUtils.getHearthBeat(3); // new value, say depending on 'beat'
    })
     // Hearthbeat 3
    .progress(function(msg) {
        console.log(msg);
    })
    .fail(function(id, err) {
        console.log('ERROR while getting beat' + id + ' : ' + err);
    })
    .done(function(id, beat) {
        console.log('got beat ' + id + ': ' + JSON.stringify(beat));
    });
    

    } ​​

Получение следующего:

  • Получение сердцебиения ... 1
  • Получение сердцебиения ... 1
  • Получениесердцебиение ... 1
  • получил удар 1: {"вживую": правда, "отметка времени": "14.03.2009 15:54:37 PM"}
  • получил удар 1: {"alive": true, "timestamp": "14.03.2009 15:54:37"}
  • получил удар 1: {"alive": true, "timestamp": "3 /14/2019 15:54:37 "}

1 Ответ

0 голосов
/ 15 марта 2019

Вложенность работает как положено. Тем не менее, он чище, чем вложенные обратные вызовы.

PersoUtils.getHearthBeat(1)
        .progress(function(msg) {
            console.log(msg);
        })
        .fail(function(id, err) {
            console.log('ERROR while getting beat' + id + ' : ' + err);
        })
        .then(function(id, beat) {
            console.log('got beat ' + id + ': ' + JSON.stringify(beat));
            PersoUtils.getHearthBeat(2)                     
            .progress(function(msg) {
                console.log(msg);
            })
            .fail(function(id, err) {
                console.log('ERROR while getting beat' + id + ' : ' + err);
            })
            .then(function(id, beat) {
                console.log('got beat ' + id + ': ' + JSON.stringify(beat));
                PersoUtils.getHearthBeat(3)
                .progress(function(msg) {
                    console.log(msg);
                })
                .fail(function(id, err) {
                    console.log('ERROR while getting beat' + id + ' : ' + err);
                })
                .done(function(id, beat) {
                    console.log('got beat ' + id + ': ' + JSON.stringify(beat));
                });
                return this;
            });
            return this;
        });

Результат:

  • Получение сердцебиения ... 1
  • получил удар 1: {"вживую": правда, "отметка времени": "523"}
  • Получение сердцебиения ... 2
  • получил удар 2: {"вживую": правда, "отметка времени": "590"}
  • Получение сердцебиения ... 3
  • получил удар 3: {"вживую": правда, "отметка времени": "596"}
...