只需在节点中完成执行功能后执行其余代码?

时间:2016-02-15 18:06:39

标签: javascript node.js while-loop

我正在尝试使用节点js阅读电子表格并将数据保存在数据库中,但我遇到了代码同步的问题。问题是,getDataProduct方法在insertProduct启动之前运行了2230次。当我查看dabatase时,只需保存最后一行的数据。有人可以帮帮我吗?

try {
        excel_products.forEach(function (v, i) {
            x = 1;
            var run = true;

            while (run) {

                if (v.data[x] !== undefined) {
                    if (v.data[x][15] != '') {
                        getDataProduct(v, x);
                        insertProduct();
                        insertProductSku();
                        insertProductStore();
                    }
                } else {
                    run = false;
                }

               x++;
            }

        });
    } catch (error) {
        console.log(error);
    }

更新

我认为问题是这个函数,在insertProduct()中:

    sql_product = 'INSERT QUERY';
    connection.then(function () {

    new db.Request().query(sql_product).then(function (recordset) {
    }).catch(function (error) {
    console.log(error);
    });
    }).catch(function (error) {
    console.log(error);
    });

当我打印sql_product时,它确定,但我认为保存在数据库中的功能太慢而无法运行。

2 个答案:

答案 0 :(得分:0)

您可能需要考虑使用asyncjs:https://github.com/caolan/async

每个系列会一次调用一个insertProduct,只要你可以装备insertProduct()在完成它的任务时调​​用一个回调。

如果你想一次运行多个插入,那么像队列这样的函数可以一次生成x个插入任务。

答案 1 :(得分:0)

一些可能有帮助的事情:

1 /函数insertProduct和其他函数使用全局变量很奇怪......我建议你使用params。

2 /来自db.Request().query的承诺应该在外面返回,也许承诺内的回报应该是真的,而不是来自数据库的回复(不要在不需要的函数之外共享信息)

function insertProduct(product){
   sql_product = 'INSERT QUERY';

   .... 

   return db.Request().query(sql_product).then(function (recordset) {
      return true;
   }).catch(function (error) {
       console.log(error);
   })
}

如果您的所有功能都执行此操作,您可以执行以下操作:

//We can jump de catch you have it inside the functions
insertProduct(product).then(function(){
      insertProductSku(product).then(function(){
            insertProductStore(product)
      })
})

\ 3看起来你需要按特定顺序进行迭代,你需要创建一个像这样添加实际逻辑的函数:

function nextIteration(pos) {
    var product = excel_products[pos];
    if (product.data[x] !== undefined) {
        if (product.data[x][15] != '') {
            var product = getDataProduct(v, x);
            insertProduct(product).then(function() {
                insertProductSku(product).then(function() {
                    insertProductStore(product).then(function() {
                        nextIteration(pos + 1)
                    });

                })
            })
        } else {
            nextIteration(pos + 1)
        }
    }
}

nextIteration(0);

我知道这个实现很奇怪,但是当你已经有了这个信息时,你将解决下一个动作。如果您不关心订单或使用promise.all()简化结构,您可以查看.bind,但最好一步一步地进行。

我没有尝试过多触及逻辑。我希望我很清楚。