为什么在then块中返回缓存的jQuery承诺无法解决它?
我利用jQuery承诺缓存AJAX请求,当我试图在then子句中返回缓存的承诺时,这种方法似乎失败了;我不确定为什么会发生这种情况,我想知道是否有办法解决它 如果我伪造密钥并将If self.fGetSearchResults.oCache[…块放在块外部的缓存定义下,那么代码将按预期工作为什么在then块中返回缓存的jQuery承诺无法解决它?,jquery,Jquery,我利用jQuery承诺缓存AJAX请求,当我试图在then子句中返回缓存的承诺时,这种方法似乎失败了;我不确定为什么会发生这种情况,我想知道是否有办法解决它 如果我伪造密钥并将If self.fGetSearchResults.oCache[…块放在块外部的缓存定义下,那么代码将按预期工作 MCG.searchControls.fGetSearchResults = function fGetSearchResults() { var self = this; var oDef
MCG.searchControls.fGetSearchResults = function fGetSearchResults() {
var self = this;
var oDeferred = $$.Deferred(); // `new` keyword is optional and we don't like it
var oPromise = oDeferred.promise();
self.fGetSearchResults.oCache = self.fGetSearchResults.oCache || {}; // creates a persistent cache across function calls
// perform the search
$$.when(
self.fPromiseOfFilterObject()
).done(
function fDoneCallback(oFilterObject) {
/* create the RecordListService parameters which we will query with */
..
var oRecordListServiceParametersAsKey = JSON.stringify(oRecordListServiceParameters);
// leverage our cache here
if (self.fGetSearchResults.oCache[oRecordListServiceParametersAsKey] !== undefined) {
return self.fGetSearchResults.oCache[oRecordListServiceParametersAsKey];
} else {
self.fGetSearchResults.oCache[oRecordListServiceParametersAsKey] = oPromise; // cache the result for next time
}
// do the ajax call now
$.orchestracmsRestProxy.doAjaxServiceRequest('ocms_socfp.RecordListService', oRecordListServiceParameters,
function(status, json) {
...
oDeferred.resolve(json)
});
});
return oPromise; // return a our promise object which will resolve at some point
}
马上,我会说你的.done语法可能是错误的..donefunctionoFilterObject应该是预期的。@Chris cavince:有什么问题吗?我不知道有什么问题,只是jQuery有问题。done需要一个函数或一个函数数组。使用函数声明不是我以前尝试过的。函数foobar是一个声明在{}上,functionbar{}是一个匿名函数。我希望看到.donefuncname或.donefunctionparm{}不是.donefunctionfoobar{};我猜函数foobar将返回它自己,所以可能不是问题,只是一个意外的语法。我假设您从oFilterObject生成OreRecordListServiceParameters。self.fpromiseofilterobject返回一个如何定义的承诺?我问这个问题是因为我认为您可以通过向oFilterObjec添加一个parm来完全消除缓存t、 类似于oFilterObject.servicePromise={}然后,您的代码将成为FilterObject.servicePromise | | | oDeferred.PromiseofFilterObject的返回。servicePromise@ChrisCaviness:它与jquery无关。在JS中,您可以在函数表达式的上下文中使用函数声明。这样,它就不会被声明,但名称将在函数本身的上下文中可用。