Посмотрите на этот пример:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope,$http) {
var getJoke = function(){
return $http.get('http://api.icndb.com/jokes/random').then(function(res){
return res.data.value;
});
}
getJoke().then(function(res) {
console.log(res.joke);
});
});
Как вы можете видеть, getJoke
возвращает разрешенное обещание (оно разрешено при возврате res.data.value
). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).
Это plnkr:
Руководство по интеграции показывает, как использовать HttpModule для инициализации HttpHandlers . Однако HttpModule не создается для каждого запроса; он создается один раз для приложения и регистрируется в событиях HttpApplication
, когда вызывается его метод инициализации.
Поскольку модуль является одноэлементным, вы не должны вводить зависимости в свой модуль. Вы должны разрешать зависимости для каждого запроса, а поскольку HttpModule
не может быть настроен и не является собственной зависимостью, вам нужно будет вернуться в контейнер из вашего HttpModule
. Другого выхода нет, но здесь нужно свести к минимуму количество необходимого кода. Пример:
public class UsersOnlineModule : IHttpModule
{
public void Init(HttpApplication context) {
context.PreRequestHandlerExecute += (s, e) => {
var handler = Global.GetInstance<UsersOnlineHandler>();
handler.Handle();
};
}
}
В этом примере UsersOnlineModule
делает не что иное, как разрешение одной отдельной службы и вызов ее метода на ней. Эта служба (UsersOnlineHandler
в этом случае) должна отображать всю необходимую логику и зависимости. Другими словами, ваш HttpModule
становится Humble Object , и вся логика извлекается в UsersOnlineHandler
:
public class UsersOnlineHandler
{
private readonly ITenantStore tenantStore;
private readonly ICacheManager cm;
public UsersOnlineHandler(ITenantStore tenantStore, ICacheManager cm) {
this.tenantStore = tenantStore;
this.cm = cm;
}
public void Handle() {
// logic here
}
}
ПРЕДУПРЕЖДЕНИЕ: Убедитесь, что хранить любые зависимости в поля класса или экземпляра или свойства вашего HttpModule, потому что это может привести к тому, что зависимость станет Captive Dependency . Вместо этого, как описано выше, просто разрешите, используйте и забудьте об этой зависимости, все внутри этого вызова метода. Не храните его.