gpt4 book ai didi

angularjs - 每 5 秒调用一次服务器 - 返回堆栈溢出错误

转载 作者:行者123 更新时间:2023-12-04 17:00:30 25 4
gpt4 key购买 nike

我想在一段时间内调用一个方法。我收到堆栈溢出错误。我究竟做错了什么:

html:

<div ng-app="myApp" ng-controller="Ctrl">
<span>{{calledServer}}</span>
</div>

js:
var app = angular.module('myApp', []);

app.controller("Ctrl", function($scope, repo, poollingFactory) {
$scope.calledServer;
$scope.calledServer = poollingFactory.callFnOnInterval(function() {return repo.callServer(5);});
});

app.factory("repo", function() {

function callServer(id){
return "call server with id " + id;
}

return {
callServer: callServer
};
});

app.factory("poollingFactory", function($timeout) {

var timeIntervalInSec = 5;

function callFnOnInterval(fn, timeInterval) {

$timeout(callFnOnInterval, 1000 * timeIntervalInSec);
callFnOnInterval(fn, timeIntervalInSec);
};

return {
callFnOnInterval: callFnOnInterval
};
});

jsfiddle: http://jsfiddle.net/fq4vg/423/

最佳答案

您有一个不检查任何先决条件的递归调用。

函数的注释版本:

function callFnOnInterval(fn, timeInterval) {

//Schedule a call to 'callFnOnInterval' to happen in one second
// and return immediately
$timeout(callFnOnInterval, 1000 * timeIntervalInSec);

//Immediately make a call to 'callFnOnInterval' which will repeat
// this process ad-infinitum
callFnOnInterval(fn, timeIntervalInSec);

};

因为您不断将调用递归地插入堆栈并且永不返回,所以它最终会耗尽空间。

$timeout服务返回一个 promise ,一旦完成,您可以使用它来安排更多的工作。

您的服务可能应该如下所示:
app.factory("poollingFactory", function ($timeout) {

var timeIntervalInSec = 5;

function callFnOnInterval(fn, timeInterval) {

var promise = $timeout(fn, 1000 * timeIntervalInSec);

return promise.then(function(){
callFnOnInterval(fn, timeInterval);
});
};

return {
callFnOnInterval: callFnOnInterval
};
});

这是一个示例 jsFiddle 来演示: http://jsfiddle.net/jwcarroll/cXX2S/

关于上面代码的一些说明。

您正在尝试将范围属性值设置为您的 callFnOnInterval 的返回值。但这行不通。首先,它不返回任何东西。其次,因为它是一个异步调用,它最多可以返回一个 promise .

关于angularjs - 每 5 秒调用一次服务器 - 返回堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22478933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com