Наличие вложенных обещаний и их возврат в маршрут не приведет к обновлению модели маршрута и шаблона, использующего эту модель.
В моей модели маршрута мне нужно отправить два запроса (предыдущий и последний), и в ответ я получаю их идентификаторы для отправки двух других запросов (baslineCpature и currentcapture). когда я получил ответы на оба запроса, мне нужно отправить два других запроса (fiberHealthData, wavelengthsPerSectionData). Должна возвращаться модель ember (baslineCpature,currentcapture, fiberHealthData, wavelengthsPerSectionData). у меня есть одна проблема - я хочу обновить свой шаблон, как только получу ответ для baslineCpature и currentcapture.
Вот мой код Я ценю, если кто-то может сказать мне, что я делаю неправильно.
model: function (params,transition) {
var promiseA=null;
var promiseB=null;
var promiseA1=null;
var promiseB1=null;
promiseA1 = Ember.RSVP.hash({
latest:this.store.findAll('latest'),
previous: this.store.findAll('previous'),
});
promiseA= promiseA1.then((promiseAResolved) => {
return Ember.RSVP.hash({
baselineCapture:self.store.find('capture', promiseAResolved.previous.get('firstObject.id')),
currentCapture: self.store.find('capture', promiseAResolved.latest.get('firstObject.id')),
});
});
promiseB= promiseA.then((promiseAResolved) => {
baselineId = promiseAResolved.baselineCapture.id;
currentId = promiseAResolved.currentCapture.id;
return Ember.RSVP.hash({
fiberHealthData:self.store.findAll('fiber-health',{ adapterOptions: {current: currentId, baseline: baselineId}}),
wavelengthsPerSectionData:self.store.findAll('wavelengths-per-section',{ adapterOptions: {current: currentId, baseline: baselineId}} )
});
});
//this should be retun of my model
return Ember.RSVP.hash({
baselineCapture:promiseA.baselineCapture,
currentCapture:promiseA.currentCapture,
fiberHealthData:promiseB.fiberHealthData,
wavelengthsPerSectionData:promiseB.wavelengthsPerSectionData,
});
}
2 ответа
Хорошо, сначала это то, что вы должны сделать:
const {hash} = Ember.RSVP;
return hash({
latest:this.store.findAll('latest'),
previous: this.store.findAll('previous'),
}).then(({latest, previous}) => hash({
baselineCapture:self.store.find('capture', previous.get('firstObject.id')),
currentCapture: self.store.find('capture', latest.get('firstObject.id')),
})).then(({baselineCapture, currentCapture}) => {
let current = currentCapture.id;
let baseline = baselineCapture.id;
return hash({
currentCapture,
baselineCapture,
fiberHealthData:self.store.findAll('fiber-health',{
adapterOptions: {current, baseline}
}),
wavelengthsPerSectionData:self.store.findAll('wavelengths-per-section', {
adapterOptions: {current, baseline}
}),
});
});
Используйте функции ES6 как разрушение. Это очень полезно для этих случаев использования!
Вы должны понять, как работает цепочка обещаний! Вы читали Обещания / A +? Это одна из лучших спецификаций, которые я когда-либо читал. Прочитайте это!
То, что вы сделали неправильно, использует promiseA.baselineCapture
, Вы не можете получить доступ к обещанию без его разрешения then
,
Вот что я получил на работу:
return new Ember.RSVP.Promise(resolve => {
Ember.RSVP.hash({
latest: this.store.findAll('latest'),
previous: this.store.findAll('previous'),
}).then((promiseA1Resolved) => {
Ember.RSVP.hash({
baselineCapture:self.store.find('capture', promiseA1Resolved.previous.get('firstObject.id')),
currentCapture: self.store.find('capture', promiseA1Resolved.latest.get('firstObject.id')),
}).then((promiseAResolved) => {
self.updateContext(promiseAResolved,self);
resolve({
baselineCapture: promiseAResolved.baselineCapture,
currentCapture: promiseAResolved.currentCapture,
fiberHealthData:self.store.findAll('fiber-health',{ adapterOptions: {current: self.get('contextService._currentId'), baseline:self.get('contextService._baselineId') }}),
wavelengthsPerSectionData:self.store.findAll('wavelengths-per-section',{ adapterOptions: {current: self.get('contextService._currentId'), baseline: self.get('contextService._baselineId')}} )
});
});
});
});