2016-06-29 3 views
0

У меня возникают проблемы с попыткой «зациклиться» на несколько «вложенных» обещаний с родным JS.Не удается передать данные между нативными обещаниями, когда их «петляют»

У меня есть JSON со многими подуровнями, как показано:

{ 
    "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" 
      }] 
     }] 
} 

Так что я проверил, что мне нужно использовать Promise.all.

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

Проблема возникает со вторым запросом (TABLE2), где я не могу извлечь MySQL нового идентификатора из предыдущего обещания, потому что result содержит обещание, а не данные, соответствующий ему должны быть возвращен.

Спасибо за помощь.

+0

Я ожидаю, что 'result' будет содержать данные из первого запроса. Что такое 'conole.log' этого результата var? – steampowered

+0

'result' содержит массив с результатами отдельных обещаний (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#Using_Promise.all) – mhu

ответ

1

Ваш первый аргумент result будет массивом того, что conn.query() решает (это то, что Promise.all() решает с). Итак, result.insertId будет undefined, так как result - это массив, а не объект с именованными свойствами.

.insertId будет собственностью каждого элемента массива result. Если вы хотите, чтобы прочитать его от последнего результата, возвращаемого предыдущим запросом, то вы бы использовать что-то вроде этого:

result[result.length - 1].insertId 

что согласуется с тем, как .insertId устанавливается для одной операции INSERT, как показано здесь Return last inserted id with mySQL.

Смежные вопросы