2016-05-31 21 views
0

在我的路线模型我需要发送两个请求(以前和最新),并在响应我抓住他们的ID发送两个其他请求(baslineCpature和currentcapture)。当我得到这两个请求的响应时,我需要发送两个其他请求(fiberHealthData,wavelengthPerSectionData)。应该返回的模型应该是(baslineCpature,currentcapture,fiberHealthData,wavelengthPerSectionData)。 我在这里有一个问题是,我想尽快更新我的模板,我得到了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, 
 
    }); 
 
}

+1

您正在使用promiseA'和'promiseB'的'结果他们在你的最终散列已经解决了。 – Kingpin2k

回答

1

好吧,首先,这是你应该做的:

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功能,如自毁。它对这些用例非常有用!

您需要了解承诺链如何工作!你读过Promises/A+吗?这是我读过的最好的规范之一。阅读!

你做错了什么是使用promiseA.baselineCapture。如果没有用then解决该问题,您将无法访问该承诺。

+0

让我们来看看你的答案是否有效,如果你非常渴望downvote而不是,return语句不会丢失。 –

0

这里是我开始工作:

 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')}}) 
 
       }); 
 

 
      }); 
 
      }); 
 
     });