2016-08-08 78 views
-1
_processInstructionItems(employerId, programs) 
{ 
    return new Promise((resolve, reject) => { 
     let self = this; 
     let listOfPrograms = []; 
     _.forEach(programs, item => { 
      Program.find(item.id).then(programData => { 
       this._processProgramItemCode(employerId, item, programData).then(programItem => { 
        listOfPrograms.push(programItem) 
       }) 
      }).catch(err => { 
       console.log(err); 
      }) 
     }) 
     resolve(listOfPrograms) 
    }) 
} 

Probe Payload(NodeJS) Array ist leer, nachdem im asynchronen

return { 
    user_id: 'ADMIN_TEST', 
    employer_id: '202693450004', 
    programs: [ 
     { 
     id: 1, 
     period: [ 
      { 
      date: '2016-07-01' 
      }, 
      { 
      date: '2016-08-01' 
      } 
     ] 
     }, 
     { 
     id: 4, 
     period: [ 
      { 
      date: '2016-09-01' 
      }, 
      { 
      date: '2016-10-01' 
      } 
     ] 
     } 
    ] 
    } 

Looping Ich frage mich, warum das Array nach dem Drücken der Entschlossenheit Daten innerhalb der Versprechen ist noch leer.

HINWEIS: Ich bin noch ein bisschen neu in dieser Sprache, also bitte bitte mit mir. Vielen Dank!

+0

Bitte den Code in der @AmiramKorach Frage –

+0

hinzufügen getan –

+0

Sie haben keine 'this' mehr speichern müssen, da Sie verwenden Pfeilfunktionen. Es wird 'this' von' _processInstructionItems' verwendet. – srph

Antwort

1

Dies liegt daran, dass find async ist und Sie das leere Array sofort aufgelöst haben. Das sollte korrekten Code so etwas wie:

_processInstructionItems(employerId, programs) 
 
    { 
 
     let self = this; 
 
     let listOfPrograms = []; 
 
     return Program.find({_id: {$in: _.map(programs, 'id')}}) 
 
     .then(programsData => 
 
      { 
 
     let promises = programsData.map(p => this._processProgramItemCode(employerId, p); 
 
     return Promise.all(promises); 
 
     }).catch(err => { 
 
     console.log(err); 
 
     }) 
 
    }) 
 
}

+0

Danke dafür. Ich werde es versuchen, sobald ich nach Hause komme. –

+0

Bitte geben Sie an, wie der Benutzer die Funktion verwenden und die gewünschten Daten erhalten soll. – srph

+0

Es funktioniert wie Charme. Vielen Dank! –

0

Ich bin nicht sehr vertraut mit Versprechungen, aber es sieht sehr viel wie Sie erwarten, dass Ihre listOfPrograms etwas enthalten Sie hinzufügen, um es über asynchrone Anrufe hinzufügen; Sobald etwas asynchron ist, wird Ihr Code sofort auf den Funktionsaufruf resolve() "fallen", aber Ihr Array wird immer noch leer sein.

Es ist schwierig zu sagen, ob Ihre Funktionen in der Mitte dieser Sache tatsächlich synchron oder asynchron sind, aber wenn irgendeine der Funktionen, die Sie aufrufen, ist, würde das von Ihnen beschriebene Verhalten erwartet.

Vor ein paar Wochen habe ich einige Dinge geschrieben, die mich reizte (von der Entwicklung Desktop in C kommenden ++/C#) mit node.js, man das könnte vielleicht auch helfen: http://dev.haufe.com/node-js-primer-for-old-school-developers/

Besonders das Bit mit der async for loop sieht dem, was Sie hier beschreiben, sehr ähnlich.

+0

Alle Funktionen, die im Snippet enthalten sind, enthalten Versprechen. Ich dachte, mir geht es gut, bis dieses Problem auftaucht. –