在等待太长时间响应后,Angular承诺停止工作

时间:2016-11-28 22:25:47

标签: javascript angularjs node.js express

我的应用程序向我的节点/快速服务器发出GET请求。为了检查我的服务器代码中的更改,我添加了一个setTimeout函数。我的客户端代码中的promise函数可以正常工作几分钟,但最终会停止工作并抛出错误,如果从服务器获得回报需要太长时间。有没有办法让promise函数继续运行,直到从服务器返回数据而不是立即抛出错误?基本上,我希望超时在服务器中继续运行并检查更改,我希望getMessageData() promise函数尽可能长时间保持运行。

这是我的角度应用程序中的工厂代码,它从我在nodeJS / Express内置的远程服务器获取数据:

app.factory('getMessageData', ['$q', '$http', function($q, $http) {

    var last_updated_time = 0;

    return function getData() { 
        var deferred = $q.defer();

        console.log("Time stamp is: "+last_updated_time);
        var req = $http({
            url: 'https://20161128t161542-dot-jarvis-hd-live-2.appspot-preview.com/read-message',
            method: 'GET',
            cache: false,
            params: {last_updated: last_updated_time}
        });

        req.success(function(object) {
            last_updated_time = object.time_stamp;
            deferred.resolve(object);
        });

        req.error(function(err) {
            console.log("there was an error: "+err);
            deferred.reject(err);
        });

        return deferred.promise;
    }

}]);

这是我的指令代码,它调用并启动工厂代码来发出请求:

app.directive('message', ['getMessageData', function(getMessageData) {
return {
    restrict: 'E',
    templateUrl: 'scripts/directives/message.html',
    link: function (scope) {

        function getMessage(){
            getMessageData().then(function(message_data){
                var message = message_data.data;
                scope.message = message;

                getMessage();

            }, function(err){
                console.log("Error: " + err);
            });
        }

        getMessage();

    } 
}
}]);

这是我向/ read-message url发出GET请求的服务器代码:

app.get('/read-message', function(req,res){

        var last_updated_time = req.query.last_updated;

        function checkMessage() {
            if(!last_updated_time || last_updated_time < new_time){
                updateMessage();
            }
            else {
                setTimeout(function(){
                    checkMessage();
                }, 1000 * 10); //10 seconds
            }
        }

        function updateMessage() {
            var output = {
                success: 1,
                data: message,
                time_stamp: new_time
            };

            return res.json(output);
        }

        checkMessage();


    });

1 个答案:

答案 0 :(得分:-1)

在传入$ http的对象中,您可以使用所需的值添加超时属性(以毫秒为单位)。 感谢$http