当"循环"无法在原生承诺之间传递数据。他们

时间:2016-06-29 12:19:48

标签: javascript promise

我在尝试"循环"时遇到问题多个"嵌套"与原生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,而不是返回适当的数据。

感谢您的帮助。

1 个答案:

答案 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