2016-06-29 80 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)); 

这个问题是与第二个查询(表2),我无法从以前的承诺检索MySQL的新ID,因为result包含一个承诺,而不是此时,相应的数据应该返回。

感谢您的帮助。

+0

我期望'result'包含来自第一个查询的数据。那个结果var的'conole.log'是什么? – steampowered

+0

'result'包含一个包含单个promise的结果的数组(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一致。