2016-05-31 8 views
0

in meinem Route-Modell muss ich zwei Anfragen senden (vorherige und neueste) und auf die Antwort ich ergreife ihre IDs zu senden zwei andere Anfragen (baslineCpature und currentcapture). Wenn ich die Antworten beider Anfragen erhalten habe, muss ich zwei weitere Anfragen senden (fiberHealthData, wavensesPerSectionData). ember-Modell sollte zurückgeben (baslineCpature, currentcapture, fiberHealthData, wavelengthPerSectionData). ein Problem, das ich hier habe, ist, dass ich meine Vorlage aktualisieren möchte, sobald ich Antwort für baslineCpature und currentcapture bekomme.Verschachtelte Versprechen und die Rückgabe in der Route wird nicht aktualisiert das Routenmodell und die Vorlage mit diesem Modell

Hier ist mein Code. Ich schätze es, wenn mir jemand sagen kann, was ich falsch mache.

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

Sie verwenden die Ergebnisse der 'promiseA' und' promiseB', bevor sie in Ihrem letzten Hash aufgelöst haben. – Kingpin2k

Antwort

1

Okay, zuerst ist es das, was Sie tun sollten:

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

Verwenden Sie das ES6 Funktionen wie destructing. Es ist sehr nützlich für diese Anwendungsfälle!

Sie müssen verstehen, wie Versprechen Verkettung funktioniert! Hast du Promises/A+ gelesen? Es ist eine der besten Spezifikationen, die ich je gelesen habe. Lies es!

Was Sie falsch gemacht haben, ist promiseA.baselineCapture. Sie können nicht auf ein Versprechen zugreifen, ohne es mit then zu lösen.

+0

Lassen Sie uns sehen, wenn Ihre Antwort funktioniert, wenn Sie so eifrig sind, zu downvoten und nein, Return-Anweisungen fehlten nicht. –

0

hier ist, was ich zu arbeiten habe:

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

 
      }); 
 
      }); 
 
     });

Verwandte Themen