2016-04-04 13 views
0

Ich versuche, 3 API-Aufrufe zu machen und dann ein Array aller Daten zurückgeben. Die console.log() (und daher die Funktion return) ist jedoch leer, da sie nicht darauf wartet, dass der AJAX-Aufruf aufgelöst wird - aber ich kann es nicht in der Schleife tun, da ich alle Daten benötige.Warten auf die Antwort mehrerer Versprechen in EmberJS

let data = []; 

parameters.forEach((parameter, index) => { 
    return Ember.$.ajax(url).then((response) => { 
    data.push({ 
     name: parameter.get('displayName'), 
     color: parameter.get('color'), 
     type: chart.get('chartType'), 
     turboThreshold: 0, 
     data: response.data 
    }); 
    }); 
}); 

console.log(data); 
return data; 

Ich denke, dass ich Ember.RSVP.hash() dafür verwenden kann, aber ich kann nicht scheinen, um es zu bekommen ... zu arbeiten, kann mir jemand in die richtige Richtung?

+0

'Parameter' ist ein Array, ja? –

+0

Ja, es ist ein Array von Objekten, die durch eine Ember hasMany-Beziehung zurückgegeben wurden –

Antwort

0

Eigentlich können Sie nicht auf Versprechungen warten, es sei denn, Sie befinden sich in den Modell-Hooks der Routen. Siehe Modell Hooks auf the guide

Sie haben eine andere Option, versuchen Sie, Daten direkt auf das Element festzulegen, wenn Daten aufgelöst werden. (Innerhalb der dann Funktion)

0

Man könnte so etwas wie dies versucht:

return Promise.all(parameters.map(parameter => Ember.$.ajax(url).then(response => { 
    'name': parameter.get('displayName'), 
    'color': parameter.get('color'), 
    'type': chart.get('chartType'), 
    'turboThreshold': 0, 
    'data': response.data 
}))).then(data => { 
    console.log(data); 
    return data; 
}); 
1

Return ein Versprechen, und es zu lösen, wenn alle inneren Versprechen gelöst werden. Ich habe den Code nicht ausprobiert, aber das sollte dir zeigen, wie es weitergeht.

return new Ember.RSVP.Promise(function (resolve) { //return a promise 
    let promises = []; 
    let data = []; 

    parameters.forEach((parameter, index) => { 
     promises[index] = Ember.$.ajax(url).then((response) => { //store all inner promises 
     data.push({ 
      name: parameter.get('displayName'), 
      color: parameter.get('color'), 
      type: chart.get('chartType'), 
      turboThreshold: 0, 
      data: response.data 
     }); 
     }); 
    }); 

    Ember.RSVP.all(promises).then(function(){ 
     resolve(data); //resolve the promise when all inner promises are resolved 
    }); 
}); 
Verwandte Themen