2016-11-28 43 views
0

我的應用程序向我的節點/快遞服務器發出GET請求。要檢查我的服務器代碼中的更改,我添加了setTimeout函數。我的客戶端代碼中的promise函數可以正常工作幾分鐘,但最終會停止工作,並且如果從服務器返回某些內容會花費太多時間會引發錯誤。有沒有辦法讓promise函數繼續運行,直到它從服務器獲取數據而不是立即拋出錯誤?基本上,我希望超時繼續在服務器上運行並檢查更改,並且我希望getMessageData()承諾函數儘可能保持運行狀態。角度承諾在等待響應太久後停止工作

這是在我的角度應用我的工廠代碼,從我建的NodeJS /快速遠程服務器獲取數據:

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(); 

    } 
} 
}]); 

這是一個GET請求到/讀取信息的URL我的服務器代碼:

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(); 


    }); 
+0

了'promise'得到解決或者拒絕一次(不像一個事件偵聽器),所以你需要繼續看漲'getMessageData'並返回一個新的'promise'對象 - 這個職位可能是有益的,指向你在正確的方向http://stackoverflow.com/questions/15015416/how-to-set-a-global-http-timeout-in-angularjs –

+0

無論如何做長期投票呢? –

回答

-1

在你傳遞給$ http的對象中,你可以用你想要的值(以毫秒爲單位)添加一個超時屬性。 reffer這個$http

+0

你能給更多的清晰度嗎?我是否將配置對象添加到我的需求? '變種REQ = $ HTTP({ \t \t \t URL: 'https://20161128t161542-dot-jarvis-hd-live-2.appspot-preview.com/read-message', \t \t \t方法:「 GET」, \t \t \t緩存:假的, \t \t \t PARAMS:{LAST_UPDATED:last_updated_time} \t \t});' –

+0

只是超時添加到您的對象的末尾。 var req = $ http({url:'https://20161128t161542-dot-jarvis-hd-live-2.appspot-previe w.com/read-message',方法:'GET',緩存:false,params :{last_updated:last_updated_time},timeout:1000}); – monssef

+0

這不起作用。當我添加這個超時時,我的應用程序在給我錯誤之前等待1秒鐘。 –