2016-06-29 7 views
0

Ich habe Probleme beim Versuch, mehrere "verschachtelte" Versprechungen mit nativen JS "zu wiederholen".Daten können nicht zwischen nativen Versprechungen übergeben werden, wenn sie "geloopt" werden

Ich habe einen JSON mit vielen Unterebenen wie gezeigt:

{ 
    "project": { 
     "name": "TESTNAME", 
     "label":"string11405", 
     "description":"das", 
    }, 
    "form": [{ 
     "label": "string", 
     "name": "string", 
     "fields": [{ 
      "label": "string", 
      "name": "string", 
      "field_type_id": "string", 
      "meta": [{ 
       "meta_name": "string", 
       "meta_value": "string" 
      }] 
     }] 
} 

So habe ich überprüft, dass ich Promise.all verwenden müssen.

return Promise.all(_.map(req.crfData ,(value,index,arr) => { 
     var table = 'TABLE1'; 

     return conn.query(`INSERT INTO ${table} SET ?`,[value]); 
    })) 
    .then((result) => { 
     var table = 'TABLE2'; 

     return Promise.all(_.map(req.fieldData ,(value,index,arr) => { 
      value.crf_id = result.insertId; 
      return conn.query(`INSERT INTO ${table} SET ?`,[value]); 
     })); 
    }) 
    .then((result) => { 
     var table = 'TABLE3'; 

     return Promise.all(_.map(req.fieldData ,(value,index,arr) => { 
      return conn.query(`INSERT INTO ${table} SET ?`,[value[0]],(err) => next(err)); 
     })); 
    }) 
    .catch((err) => next(err)); 

Das Problem kommt mit der zweiten Abfrage (Tabelle 2), wo ich nicht die mysql neuen id aus dem vorherigen Versprechen abrufen kann, weil result ein Versprechen enthält und nicht die sachgemäßen Daten zurückgegeben werden sollen.

Danke für die Hilfe.

+0

Ich würde erwarten, dass das 'Ergebnis' Daten aus der ersten Abfrage enthält. Was ist das 'conole.log' dieses Ergebnisses var? – steampowered

+0

'result' enthält ein Array mit den Ergebnissen der einzelnen Versprechen (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#Using_Promise.all) – mhu

Antwort

1

Ihr erstes result Argument wird ein Array von was auch immer conn.query() löst mit (das ist, was Promise.all() löst mit). So wird result.insertIdundefined sein, da result ein Array ist, kein Objekt mit benannten Eigenschaften.

.insertId wird eine Eigenschaft auf jedem einzelnen Array-Element von result sein. Wenn Sie es aus dem letzten Ergebnis durch die vorherige Abfrage zurückgegeben lesen möchten, dann würden Sie so etwas wie folgt verwenden:

result[result.length - 1].insertId 

dies stimmt mit der, wie .insertId für eine einzelne INSERT-Operation eingestellt ist, wie hier Return last inserted id with mySQL gezeigt.