【问题标题】:Angular promise stops working after waiting too long for response等待响应时间过长后,Angular Promise 停止工作
【发布时间】:2016-11-28 22:25:47
【问题描述】:

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

这是我在我的 Angular 应用程序中的工厂代码,它从我在 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();


    });

【问题讨论】:

  • A promise 仅被解析或拒绝一次(与事件侦听器不同),因此您需要继续调用 getMessageData 并返回一个新的 promise 对象 - 这篇文章可能会有所帮助并且为您指明正确的方向stackoverflow.com/questions/15015416/…
  • 无论如何要为此做长轮询?

标签: javascript angularjs node.js express


【解决方案1】:

在您传递给 $http 的对象中,您可以添加具有所需值的超时属性(以毫秒为单位)。 参考这个$http

【讨论】:

  • 你能说得更清楚些吗?我是否将配置对象添加到我的请求中? 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} });
  • 只需将超时添加到对象的末尾。 var req = $http({ url: '20161128t161542-dot-jarvis-hd-live-2.appspot-previe‌​w.com/read-message', 方法: 'GET', 缓存: false, 参数: {last_updated: last_updated_time}, 超时: 1000});跨度>
  • 这不起作用。当我添加此超时时,我的应用程序会等待 1 秒,然后才会给我错误。
  • 这就是它的设置,1000ms = 1sec。将其更改为最适合您的。
  • 通过将此超时添加到 req 函数,它是否每 1 秒运行一次该函数?无论我投入什么时间,都不会辜负我的承诺。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2016-03-28
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多