链依赖的jQuery因进度而延迟,然后失败

时间:2019-03-14 20:44:25

标签: jquery jquery-deferred

我对JS promise有点陌生,并且使用jQuery 1.7.1在旧系统上工作 在尝试清理一些回调混乱时,我似乎正在创建一个新的回调。 预先感谢您的帮助!

  1. 创建了用于通过Ajax访问webapi服务的实用程序。我在用 jQuery的 Deferred()而不是 new Promise(),但是最后我是 返回 Promise (承诺),一旦成功/失败, 解决/拒绝。

    symlink.txt

    })();

    1. 需要在上一个完成后请求新的心跳:

      function testHeartBeatChaining(){

      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();
          }
      };
      // ...
      

      }

获取以下信息:

  • 得到心跳... 1
  • 得到心跳... 1
  • 得到心跳... 1
  • 赢了1:{“ alive”:true,“ timestamp”:“ 3/14/2019 3:54:37 PM”}
  • 赢了1:{“ alive”:true,“ timestamp”:“ 3/14/2019 3:54:37 PM”}
  • 赢了1:{“ alive”:true,“ timestamp”:“ 3/14/2019 3:54:37 PM”}

1 个答案:

答案 0 :(得分:0)

套入工作正常。不过,它比嵌套回调更干净。

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:{“ alive”:true,“ timestamp”:“ 523”}
  • 得到心跳... 2
  • 赢了2:{“ alive”:true,“ timestamp”:“ 590”}
  • 得到心跳... 3
  • 击败了3:{“ alive”:true,“ timestamp”:“ 596”}