簡體   English   中英

AngularJS:超時承諾調用

[英]AngularJS: timeout promise calls

在我的AjaxPromiseService.js工廠中,我一直試圖將超時機制合並到promise調用中(通常是對遠程服務的$ http.get / post調用)。 我當前正在做的方式是在$timeout事件和實際的promise調用之間創建競賽。 如下示例代碼(來自我在AngularJS中的AjaxPromiseService.js工廠的代碼): 在此plnkr中也可用

var timeoutObj = {"isTimeout": true};

function timeoutPromise(deferredObj) {
      $timeout(function() {
        console.log("promise timeout");
        deferredObj.resolve(timeoutObj);
        }, timeoutLimit); // timeoutLimit is in milisecond
    }

//promise calls (e.g. $http.get())
function getDummyData(milisec) {
      var data = {"data" : "dummy data from ajax!"};
      var deferred = $q.defer();

      timeoutPromise(deferred); //start the race to see who resolves first

      //use $timeout to mimick an AJAX call
      $timeout(function() {
        deferred.resolve(data);
        $timeout.cancel(timeoutPromise(deferred)); //not working, how to cancel the race here?
      }, milisec); //

      return deferred.promise;

    } //getDummyData

這似乎工作,如果getDummyData()未在規定的時間內解決, timeoutPromise()將返回有用的標志,所以我可以讓AJAX調用失敗優雅。 最終, timeoutPromise()getDummyData()都將按順序最終解決,但是,如果getDummyData() 撤銷 timeoutPromise() ,我想取消 timeoutPromise() 我想知道如何做到這一點?

$http有一個timeout參數,當一個promise被解決時,它將使請求timeout -因此,您可以給它一個$timeout

getData: function(input, timeout){
  var timeoutPromise = timeout ? $timeout(function(){}, timeout) : null;

  return $http({url: "/some/url",
                timeout: timeoutPromise,
                method: "GET"
               }).then(function(response){
                  var data = response.data;
                  // do something with data, if needed
                  return data;
               });
}

DEMO

如果您使用的是$ http,則有一個更簡單的選項。 使用$ http配置對象的timeout屬性和$ timeout服務:

var requestTimeout = $timeout(function() {}, 4000);
$http({ method:'GET', url:'...', timeout: requestTimeout});
requestTimeout.then(function() {
   console.log ('request aborted - timed out!');
});

如果請求在超時時間內成功,則$ timeout將自動中止。

根據$ http文檔$ http配置timeout屬性接受一個諾言,或者一個毫秒數

timeout{number|Promise}超時(以毫秒為單位),或承諾應在解決后中止請求。

因此,解決方案很簡單:

function getData () {
    return $http.get(someUrl, {timeout: 3000});  // adjust the value to what you need
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM