当“循环”时,不能在本机承诺之间传递数据;他们
Can't pass data between native promises when "looping" them
我在尝试使用原生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的新id,因为result
包含一个承诺,而不是适当的数据应该返回。
谢谢你的帮助
您的第一个result
参数将是conn.query()
解析的任何数组(这就是Promise.all()
解析的)。因此,result.insertId
将是undefined
,因为result
是一个数组,而不是一个具有命名属性的对象。
.insertId
将是result
的每个单独数组元素的属性。如果您想从前一个查询返回的最后一个结果中读取它,那么您可以使用如下内容:
result[result.length - 1].insertId
这与.insertId
如何为单个INSERT操作设置一致,如下所示。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 全局变量和全局对象的属性之间有什么区别吗
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- java.net和javascript之间正则表达式的差异
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 两个函数之间的角度承诺
- JS承诺:然后和捕获之间有什么区别
- 成功之间的区别,然后随着决心,承诺,http在angularjs中
- 返回承诺与返回承诺内未定义之间的区别
- Q承诺.“何时”和“然后”之间的差异
- Q - 在 DAG 中执行一系列承诺并定义它们之间的依赖关系
- 承诺的两种实现之间的差异
- angular承诺对象之间的区别
- 如何重用一个函数,是在一个链之间的then(承诺相关)
- 承诺输出在NodeJs和Browser之间是不同的
- 在承诺数组之间添加延迟
- 如何在for循环中组织承诺,并在javascript函数之间传递参数
- 组件之间的AngularJS通过模板进行通信(带有承诺)
- 当“循环”时,不能在本机承诺之间传递数据;他们