当“循环”时,不能在本机承诺之间传递数据;他们

Can't pass data between native promises when "looping" them

本文关键字:之间 承诺 数据 他们 本机 循环 不能      更新时间:2023-09-26

我在尝试使用原生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操作设置一致,如下所示。