Typical, as soon as I ask the question I spot the answer.
In the if (_jobs.length === 0)
block I'm returning the $http.get
instead of executing it and allowing the promise to return the result.
This does what I expect.
if (_jobs.length === 0) {
$http.get('/api/WorksOrders/GetNew').success(function(data) {
_jobs = data; // I also forgot this line, without it _jobs will always be empty and the else block will never execute
deferredJobs.resolve(data);
});
} else {
deferredJobs.resolve(_jobs);
}