我在尝试"循环"时遇到问题多个"嵌套"与原生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),我无法从之前的promise中检索mysql新id,因为result
包含一个promise,而不是返回适当的数据。
感谢您的帮助。
答案 0 :(得分: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。