【问题标题】:node and knex - populating in-between table Promise problemsnode 和 knex - 填充中间表 Promise 问题
【发布时间】:2018-06-18 10:09:37
【问题描述】:

使用 MySQL、Node.js、Knex、Promise。

第一次使用 Promise、Knex 和 Node。由于我不习惯 Promise 和异步调用,我无法完成给定的任务。

想法如下 - 有两个表(productsparts)。使用一些批量插入将数据迁移到那里。中间有表“products_parts”,没有填写,我需要创建节点js代码来填写这个表。当数据被填写时,那么在未来我们有时仍然需要为一些单独的产品调用这个函数。

这里是算法:

  1. 查询产品
  2. 对于查询的每个产品 - 将 product.description 分成几部分(用逗号分隔)。例如,如果description = "A1, B1, C1" 那么我们将有三个部分 - A1B1C1 并且需要处理每个部分。
  3. 使用产品部分执行下一步(称之为PART) - 现在这是在 FOR 循环中编写的,但可能应该以某种方式替换为 Promise 的东西。

  4. 尝试在数据库“parts”表中查找PART

    • 如果找到然后插入数据库“product_parts”。
    • 如果未找到,则首先使用新找到的 PART 填充“PARTS”表。然后还填充“product_parts”表。

我是这样开始的:

knex("products")
    .select("id", "description")
    .map(function (row) {
        // do staff with products.descriptin, simplified version:
        var descriptionSplitByCommas = desc.split(",");  

        // do staff with each description PART here
        // This for is not async and I believe is a bad idea, but how?!
        for (var k = 0; k < descriptionSplitByCommas.length; k++) {
          // STEP 3-4 should be here

          // normalisation includes some string functions to be called
         d = get_normalised_description(descriptionSplitByCommas[k]);
         knex("PARTS")
            .where("name", "=", d)
            .first()
            .then(function (row) {
                if (row != undefined) { //not found
                    // do knex insert into "product_parts" table
                } else {
                   // do knex insert into "PARTS" table
                   // do knex insert into "PRODUCT_PARTS" table 
                }
          })
        }
    })

【问题讨论】:

  • 那么问题出在哪里?除了没有提供代码并用 cmets 替换之外,我认为没有问题。如果.then 中的函数使用变量k,那么你就有麻烦了,因为你可能需要在IIFE 中返回knex("PARTS"),以便在closure 中捕获k 的值。
  • 您最好返回 return Promise.all(descriptionSplitByCommas.map(description=&gt;... 而不是 for (var k = 0; k &lt; descriptionSplitByCommas.length; k++) {,这要简单得多,并且不需要像我的第一条评论那样关闭或 IIFE。
  • @Hmr 我相信 tghat for 循环是不正确的,因为它不像 Promise。在 for 循环内部会有多个 then。我正在尝试通过 Promise.all 了解。

标签: javascript mysql node.js promise knex.js


【解决方案1】:

也许以下方法会起作用,但由于不起作用的代码在您的 cmets 中,我无法确定:

knex("products")
    .select("id", "description")
    .map(function (row) {
      return Promise.all(
        desc.split(",")
        .map(get_normalised_description)
        .map(
          descripion=>
            knex("PARTS")
            .where("name", "=", descripion)
            .first()
            .then(function (row) {
              return Promise.all([
                //insert into product_parts table,
                //(row!==undefined)
                //  ? undefined
                //  : insert into parts table
              ])
            })
        )
      )
    })

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多