“循环”它们时无法在本机承诺之间传递数据

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。

【讨论】:

以上是关于“循环”它们时无法在本机承诺之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

从无限的while循环中在函数之间传递数据

传递新数据时无法更新图形(“动态图”)

如何在 Promise 之间异步传递数据?

在vue中传递承诺中的数据

嵌套传递查询?

链式承诺不会在拒绝时传递