我有两个 JS 函数,都返回
jQuery
的 promise
。假设它们是:getServerTimestamp()
和 doSomething()
.
getServerTimestamp()
,在第一次调用时,基本上
deferred.resolve()
如果稍后再次调用
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()
的错误。但是我觉得这样写代码两次。或者我应该忘记以这种方式弄得一团糟吗?会有更优雅的选择吗?