链接 jQuery.Deferred

问题描述 投票:0回答:0

我有两个 JS 函数,都返回

jQuery
promise
。假设它们是:
getServerTimestamp()
doSomething()
.

getServerTimestamp()
,在第一次调用时,基本上

  1. 通过ajax获取服务器上的当前时间
  2. 计算出本地时间和服务器时间之间的差异
  3. 本地存储时差
  4. 使用
    deferred.resolve()
  5. 返回服务器时间

如果稍后再次调用

getServerTimestamp()
,它将检查是否存储了时间差。

  • 如果是这样,它将使用存储的时差计算出服务器时间,并使用
    deferred.resolve()
  • 返回计算出的服务器时间
  • 如果没有,它将像第一次被调用一样运行。

所以我必须在依赖于

doSomething()
的函数中调用
getServerTimestamp()
,并且因为
getServerTimestamp()
返回
promise
,我还必须为函数返回一个
promise
。简而言之,我的函数看起来有点像这样:(我承认我不太擅长处理多个
deferred
s 和
promise
s。)

function myFunction() {
  var dfd = jQuery.Deferred();
  getServerTimestamp().then(
    function (serverTime) {
      doSomething().then(
        function (...) {
          ...
          dfd.resolve(...);
        },
        function (errorMessage) {
          ...
          console.log(errorMessage);
          dfd.reject(errorMessage);
        }
      );
    },
    function (errorMessage) {
      ...
      console.log(errorMessage);
      dfd.reject(errorMessage);
    }
  );
  return dfd.promise();
}

我认为以这种方式链接所有的承诺看起来有点笨拙,尤其是错误处理部分。我想知道是否有一种优雅的方式来做到这一点。

我想到的另一件事是 - 因为

getServerTimestamp()
实际上 只进行一次 ajax 调用,它只会在本地解决所有问题,而无需在首次成功返回后进行进一步的 ajax 调用。就拥有好的代码而言,如果我分解并分解出
getServerTimestamp()
并像下面那样做,这会是更好的做法吗?

function myFunction() {
  var dfd = jQuery.Deferred();
  if (isTimeDifferenceReady()) {
    doSomething(getServerTimestampFromLocal());
    dfd.resolve(...);
  } else {
    getServerTimestamp().then(function() {
      doSomething(serverTime);
      dfd.resolve(...);
    }, ...);
  }
  return dfd.promise();
}

这样,当不需要 ajax 调用时,我不必担心处理来自

getServerTimestamp()
的错误。但是我觉得这样写代码两次。或者我应该忘记以这种方式弄得一团糟吗?会有更优雅的选择吗?

javascript jquery jquery-deferred
© www.soinside.com 2019 - 2024. All rights reserved.