2014-01-07 101 views
2

我有一個AngularJS應用程序,它執行 -1請求獲取主要用戶配置文件,其中包含對用戶朋友的引用,然後每個朋友請求1個請求以檢索朋友配置文件。

當我們點擊一​​個朋友的個人資料時,我們加載這個個人資料作爲主要個人資料。

我在RDF /語義網絡世界,所以我不能以不同的方式模擬這些交互,這不是問題的關鍵。

這是我試圖構建的應用程序的早期版本,它可以幫助你瞭解什麼是我的問題:http://sebastien.lorber.free.fr/addressbook/app/


代碼如下:

$scope.currentProfileUri = 'http://bblfish.net/people/henry/card#me'; 

$scope.$watch('currentProfileUri', function() { 
    console.debug("Change current profile uri called with " + $scope.currentProfileUri); 
    loadFullProfile($scope.currentProfileUri); 
}) 

// called when we click on a user's friend 
$scope.changeCurrentProfileUri = function changeCurrentProfileUri(uri) { 
    $scope.currentProfileUri = uri; 
} 

function loadFullProfile(subject) { 
    $scope.personPg = undefined; 
    // we don't want to capture the scope variable in the closure because there may be concurrency issues is multiple calls to loadFullProfile are done 
    var friendsPgArray = []; 
    $scope.friendPgs = friendsPgArray; 
    fetchPerson(subject).then(function(personPg) { 
    $scope.personPg = personPg 
    fetchFriends(personPg,function onFriendFound(relationshipPg) { 
     friendsPgArray.push(relationshipPg); 
    }); 
    },function(error) { 
    console.error("Can't retrieve full profile at "+uri+" because of: "+error); 
    }); 
} 

所以朋友會在用戶界面中追加,當http響應在promise中可用時。

問題是功能changeCurrentProfileUri可以被多次調用,並且可能會在仍有未決請求加載當前用戶的朋友時被調用。

我想知道的是,如果有可能在changeCurrentProfileUri調用中取消以前的http請求仍然處於等待狀態?因爲我試圖加載另一個用戶配置文件,所以我不再需要它們了。 這些待處理的請求將填充friendsPgArray的一個實例,該實例不在該範圍內,因此不會被放入範圍,因此它只是無用的。


使用Java期貨,或像RxScala或RxJava框架,我看到一般有某種「取消」或「取消訂閱」方法,它允許對未來結果取消註冊的興趣。是否有可能用Javascript做這樣的事情?和AngularJS?

回答

2

是的,它是!請參閱角度$ http服務文檔的this section。注意配置對象中的timeout字段。它的確如此,我認爲,正是你需要的。你可以解決這個問題,然後請求將被標記爲取消,並且將調用錯誤處理程序。在錯誤處理程序,你可以通過有HTTP狀態代碼過濾掉這種情況下 - 這將是等於0

這裏是fiddle展示這種

+0

嗨。我不想設置全局請求超時,但希望能夠取消基於用戶交互的未決請求。我沒有看到什麼可以超時爲我做。 –

+0

這不是全局超時(至少不只是)。它只是字段的名稱(不是很好)。事實上 - 這是一個承諾,可以由$ q服務創建,並根據用戶的意圖解決(取消請求)。 –

+0

@SebastienLorber爲你添加了小提琴。 –