Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将memoize函数与下划线.js一起使用_Javascript_Angularjs_Underscore.js - Fatal编程技术网

Javascript 将memoize函数与下划线.js一起使用

Javascript 将memoize函数与下划线.js一起使用,javascript,angularjs,underscore.js,Javascript,Angularjs,Underscore.js,我正在尝试使用underline.js中的memoize函数缓存ajax调用的结果。我不确定我的执行情况。以及如何使用键检索回缓存的结果数据。以下是我的实施: Javascript代码: var cdata = $http .get(HOST_URL + "/v1/report/states") .success(function(data) { //put the result in the angularJs scope object. $scope.states = da

我正在尝试使用
underline.js
中的
memoize
函数缓存ajax调用的结果。我不确定我的执行情况。以及如何使用键检索回缓存的结果数据。以下是我的实施:

Javascript代码:

var cdata = $http
.get(HOST_URL + "/v1/report/states")
.success(function(data) {
    //put the result in the angularJs scope object. 
    $scope.states = data;
});

//store the result in the cache.
var cachedResult = _.memoize(
    function() {
        return cdata;
    }, "states");
是我使用memoize来存储ajax的结果是正确的。同样,一旦它被放入缓存,如何基于密钥进行检索。i、 e“states.”

具有以下功能:

var fibonacci = _.memoize(function(n) {
  return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
var fibonacci=\uu0.memoize(函数(n){
返回n<2?n:fibonacci(n-1)+fibonacci(n-2);
});
您应该理解,这只是一个额外的包装函数,它使作为参数传递的函数更智能(向其添加额外的映射对象)


在上面的示例中,计算斐波那契数的函数用
\uuu0.memoize
环绕。因此,在每次函数调用(
fibonacci(5)
fibonacci(55555)
)时,都会传递与返回值匹配的参数,因此如果需要再次调用
fibonacci(5555555)
,则无需再次计算。它只是从内部提供的映射对象中获取该值。

如果使用Angular.js的
$http
,您可能只想将
{cache:true}
作为第二个参数传递给
get
方法

要使用键值对存储值,您可能需要使用,如其他答案中所述。基本上:

var cache = $cacheFactory('cacheId');
cache.put('states', 'value');
cache.get('states');

让我们了解一下
\ memoize
是如何工作的,它将需要记忆的函数作为第一个参数,并缓存给定参数的函数返回结果。下次,如果使用相同的参数调用memorized函数,它将使用缓存的结果,并且可以避免函数的执行时间。因此,减少计算时间是非常重要的

如上所述,它记忆的上述fibonaci函数工作得非常好,因为参数具有基元类型

当您必须记忆接受对象的函数时,就会出现问题。为了解决这个问题,
\uuuIZE
接受一个可选参数
hashFunction
,该参数将用于对输入进行哈希运算。通过这种方式,您可以使用自己的哈希函数唯一地标识对象

\uuu0.memoize
(使用默认哈希函数)的默认实现将按原样返回第一个参数-对于JavaScript,它将返回
[Object]

比如说

var fn = function (obj){ some computation here..}
var memoizedFn = _.memoize(fn);

memoizedFn({"id":"1"}) // we will get result, and result is cahced now

memoizedFn({"id":"2"}) // we will get cached result which is wrong
为什么默认值在uz中有函数。memoize是函数(x){return x}

通过传递哈希函数可以避免该问题

_.memoize(fn, function(input){return JSON.stringify(input)});
当我对一个处理数组参数的函数使用u.memoize时,这对我来说是一个真正的帮助


希望这对很多人的工作有所帮助。

修复了一些语法错误并添加了一些附加信息。警告:该示例具有无限递归!调用
fibonacci(x)