Повторно отправить запрос Angular $http

У меня есть обещание $http в угловом приложении, например:

this.data = $http.get('/api/foo', {})

Затем другие части моего приложения добавляют к этому обещанию обработчики успеха и ошибок.

Моя проблема в том, что я хочу обновить информацию в переменной this.data, а затем повторно запустить все прикрепленные к обещанию обработчики. Можно ли это сделать с помощью какого-то метода this.data.$refresh(), или мне придется хранить все обработчики где-то еще и повторно прикреплять их к новому $http.get?


РЕДАКТИРОВАТЬ: Может быть, немного более ясный пример:

this.data = $http.get('/api/foo', {})
this.data.success(doSomething)

// doSomething() runs because the response arrives.

this.data.someMagic()

// doSomething() runs again without being reattached.

Чего я хочу избежать, так это:

this.data = $http.get('/api/foo', {})
this.data.success(doSomething)

// Time passes...

this.data = $http.get('/api/foo', {}) // All old handlers have now been thrown away.
this.data.success(doSomething)

Это связано с тем, что есть несколько обработчиков как для успеха, так и для ошибки, и они добавляются разными контроллерами и службами, поэтому потребуется какая-то запутанная система обратного вызова, чтобы заставить их всех повторно подключать свои обработчики каждый раз, когда переменная обновляется.


person Tom    schedule 09.09.2014    source источник
comment
это дубликат этого вопроса? stackoverflow.com/questions/14693815/   -  person Chris Hawkes    schedule 09.09.2014
comment
Я так не думаю. Это делает новое обещание и прикрепляет новый обработчик. Я хочу создать новое обещание и повторно запустить все ранее прикрепленные обработчики. Возможно, мне просто придется довольствоваться новым промисом и новыми обработчиками, но это не очень удачное решение.   -  person Tom    schedule 09.09.2014


Ответы (1)


повторно запустить все прикрепленные обработчики промиса.

Нет, это невозможно. По контракту обещание разрешается и выполняет свои обработчики только один раз.

должен ли я хранить все обработчики где-то еще и снова подключать их к новому $http.get?

Да, это возможное решение, хотя оно теряет все приятные свойства промисов, такие как цепочка. Вы также можете просто поместить EventEmitter и реализовать какой-то pub-sub (см., например, Angularjs pubsub vs $broadcast) .

Если вы хотите иметь реальный потоковый интерфейс со всевозможными вкусностями, вы можете заглянуть в FRP, например с Bacon.js и угловой-бекон.

person Bergi    schedule 09.09.2014
comment
Спасибо за ответ, и спасибо за ссылки! Я посмотрю на них. - person Tom; 09.09.2014