node和knex - 填充表之间的Promise问题

时间:2018-01-09 11:22:46

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

使用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. 尝试在数据库中找到PART" parts"表。

    • 如果找到,则插入db" product_parts"。
    • 如果没有找到,那么首先填写" PARTS"新发现的PART表。然后还填充" product_parts"表
  5. 我是这样开始的:

    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 
                    }
              })
            }
        })
    

1 个答案:

答案 0 :(得分:0)

也许以下内容可行,但由于代码不起作用,因此我无法确定:

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
              ])
            })
        )
      )
    })