javascript - 如何将链接 promise 与数组的循环一起使用?

标签 javascript mysql arrays node.js

所以,我有这段代码。我正在尝试永远调试它。我不知道为什么它返回错误。我可能忘记了一些 promise 元素,或者我的 array.push 有问题,因为当我查看日志时,它在我将一些对象插入数组的行上抛出错误。

到目前为止,这是我的代码:

router.post('/inventory/product/stocks/add/(:id)', authenticationMiddleware(), function(req, res, next) {
const db = require('../db.js')

var product_no = req.params.id
var cog = req.body.cog
var size_slug = req.body.size_slug
var size_name = req.body.size_name
var rowinserted = 0
var initial_stock = req.body.initial_stock
var stock_id = new Array
var batch_id = new Array
var stock = new Array
var batch = new Array

new Promise(function(resolve, reject) {
    console.log('one');
    // Getting product product_slug for product_sku

    let sql = `SELECT product_slug
               FROM inventory_tbl
               WHERE product_no = ?`

    db.query(sql, [req.params.id], (error, results, fields) => {
        if (error) {
            throw error;
        } else {
            var product_slug = results[0].product_slug
            resolve(product_slug)
        }
    })
})
.then(function(value) {
    console.log('two');
    // Insert product sizes together with its initial stock

    for (var x = 0; x < size_slug.length; x++) {
        var product_sku = value + size_slug[x]
        var slug = size_slug[x]
        var name = size_name[x]
        var initial_stock = initial_stock[x]
        console.log(product_sku);
        if (size_slug[x] != '') {
            stock.push({
                product_sku: product_sku,
                product_no: product_no,
                size_slug: slug,
                size_name: name,
                total_stock: initial_stock,
                available_stock: initial_stock
            })
        }
        console.log(stock);
    }

    for (var x = 0; x < size_slug.length; x++) {
        var product_sku = value + size_slug[x]
        var initial_stock = initial_stock[x]
        if (size_slug[x] != '') {
            batch.push({
                product_no: product_no,
                product_sku: product_sku,
                production_date: mysql.raw('CURRENT_TIMESTAMP'),
                batch_cog: cog,
                initial_stock: initial_stock,
                stock_left: initial_stock
            })
        }
        console.log(batch);
    }

    return value
})
.then(function(value) {
    console.log('three');
    // Insert rows to product_tbl and stock_tbl

    for (var i = 0; i < stock.length; i++) {
        let sql = `INSERT INTO product_tbl(product_sku, product_no, size_slug, size_name, total_stock, available_stock) VALUES (?, ?, ?, ?, ?, ?)`

        db.query(sql, [stock[i].product_sku, req.params.id, stock[i].size_slug, stock[i].size_name, stock[i].total_stock, stock[i].available_stock], (error, results, fields) => {
            if (error) throw error
            db.query(`SELECT LAST_INSERT_ID() AS id;`, (error, results, fields) => {
                stock_id[i] = results[0].id
            })
        })

        sql = `INSERT INTO stocks_tbl(product_no, product_sku, production_date, batch_cog, initial_stock, stock_left) VALUES (?, ?, CURRENT_DATE, ?, ?, ?)`

        db.query(sql, [req.params.id, batch[i].product_sku, batch[i].batch_cog, batch[i].initial_stock, batch[i].stock_left], (error, results, fields) => {
            if (error) throw error
            db.query(`SELECT LAST_INSERT_ID() AS id;`, (error, results, fields) => {
                batch_id[i] = results[0].id
            })
        })
        rowsupdated++
    }

    return value
})
.then(function(value) {
    console.log('four');
    // Render the web page
    if (rowinserted != sizeslug.length) {
        req.flash('error', error)

        res.redirect('/admin/inventory/product/stock/add/' + req.params.id)
    } else {
        req.flash('success', 'Data added successfully!')
        res.redirect('/admin/inventory/product/stock/add/' + req.params.id)
    }
})
.catch(function(error) {
    console.log('error');
    // Error handler

    for (var i = 0; i < rowinserted; i++) {
        let sql = `DELETE FROM product_tbl WHERE product_sku = ?`

        db.query(sql, [stock_id[i]], (error, results, fields) => {
            if (error) throw error
        })

        sql = `DELETE FROM stocks_tbl WHERE product_sku = ?`

        db.query(sql, [batch_id[i]], (error, results, fields) => {
            if (error) throw error
        })
    }

    res.redirect('/admin/inventory/product/stock/add/' + req.params.id)
})
})

我的日志返回:

一个

两个

错误

编辑:进程在 console.log('two') 之后停止(我不确定具体的行,但根据日志输出),因为我也尝试在for 循环,但它们不会在那里进行。它只是转到 .catch/error。

最佳答案

不是在 console.log('error'); 中输出字符串,而是转储出您在 catch 中收到的实际 error 对象> 处理程序。它将提供有关失败原因和失败位置的更多详细信息。我怀疑 console.log('two'); 之后的代码抛出了一个异常,然后你无意中吞下了它。

考虑将您的代码拆分为单独的主题函数。这样您就可以更轻松地维护和发现错误(或打字错误)。

关于javascript - 如何将链接 promise 与数组的循环一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587636/

相关文章:

mysql - 在选择语句中使用存储过程

javascript - 从reducers渲染到React

javascript - tsconfig 文件中存在语法错误?

javascript - 当 pub.dev 插件没有 web 支持时,使用 npm packages for flutter web

javascript - 区分客户端运行的是 OSX 还是 Windows

mysql - 如果表中的所有列都是某个唯一键的一部分,可以吗?

javascript - Angular ES6 - $inject 不是函数

mysql - 如何在 'create table'语句中使用字符串变量值?

java - 根据另一个数组中的特定条件将数组中的特定值相乘并将值存储在新数组中?

arrays - 对象数组和 TableView