Refactoring permalink checker to handle multiple requests elegantly

This commit is contained in:
Rob Harrington
2015-01-20 08:24:43 +11:00
parent 7ad9fdf0be
commit 83726eba63
2 changed files with 50 additions and 19 deletions

View File

@@ -1,17 +1,23 @@
angular.module("admin.enterprises")
.controller "permalinkCtrl", ($scope, PermalinkChecker) ->
$scope.pristinePermalink = $scope.Enterprise.permalink
# locals
initialPermalink = $scope.Enterprise.permalink
pendingRequest = null
# variables on $scope
$scope.availablility = ""
$scope.checking = false
$scope.$watch "Enterprise.permalink", (newValue, oldValue) ->
if newValue == $scope.pristinePermalink
$scope.availability = ""
else
$scope.checking = true
PermalinkChecker.check(newValue).then (data) ->
$scope.availability = 'Available'
$scope.checking = false
, (data) ->
$scope.availability = 'Unavailable'
$scope.checking = false
$scope.checking = true
pendingRequest = PermalinkChecker.check(newValue)
pendingRequest.then (data) ->
if data.permalink == initialPermalink
$scope.availability = ""
else
$scope.availability = data.available
$scope.Enterprise.permalink = data.permalink
$scope.checking = false
, (data) ->
# Do nothing (this is hopefully an aborted request)

View File

@@ -1,11 +1,36 @@
angular.module("admin.enterprises").factory 'PermalinkChecker', ($q, $http) ->
new class PermalinkChecker
check: (permalink) ->
deferred = $q.defer()
$http.get("/enterprises/check_permalink?permalink=#{permalink}", { headers: { 'Accept': 'application/javascript' } } )
.success( (data) ->
deferred.resolve data
).error (data) ->
deferred.reject(data)
deferredRequest: null
deferredAbort: null
deferred.promise
check: (permalink) =>
@abort(@deferredAbort) if @deferredRequest && @deferredRequest.promise
@deferredRequest = deferredRequest = $q.defer()
@deferredAbort = deferredAbort = $q.defer()
request = $http(
method: "GET"
url: "/enterprises/check_permalink?permalink=#{permalink}"
headers:
Accept: 'application/javascript'
timeout: deferredAbort.promise
)
.success( (data) =>
deferredRequest.resolve
permalink: data
available: "Available"
).error (data,status) =>
if status == 409
deferredRequest.resolve
permalink: data
available: "Unavailable"
else
# Something went wrong or request was aborted
deferredRequest.reject()
deferredRequest.promise.finally ->
request = deferredRequest.promise = null;
deferredRequest.promise
abort: (deferredAbort) ->
deferredAbort.resolve()