“循环”它们时无法在本机承诺之间传递数据
Posted
技术标签:
【中文标题】“循环”它们时无法在本机承诺之间传递数据【英文标题】:Can't pass data between native promises when "looping" them 【发布时间】:2016-11-01 03:30:47 【问题描述】:我在尝试使用本机 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) 中,因为result
包含一个promise 而不是应该返回适当的数据,所以我无法从前一个promise 中检索mysql 新ID。
感谢您的帮助。
【问题讨论】:
我希望result
包含来自第一个查询的数据。该结果变量的conole.log
是什么?
result
包含一个数组,其中包含各个承诺的结果 (developer.mozilla.org/en-US/docs/Web/javascript/Reference/…)
【参考方案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。
【讨论】:
以上是关于“循环”它们时无法在本机承诺之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章