【问题标题】:looping in javascript - callback happening before first loop is fully over在javascript中循环 - 在第一个循环完全结束之前发生回调
【发布时间】:2020-10-14 11:48:31
【问题描述】:

需要一些帮助来纠正 javascript 中的循环闭包。

必需流程:运行 MasterGet 函数,从 mysql 表中获取数据,为获取的每条记录运行一组“规则”。

面临的问题:如果提取了两条记录,同时为记录 1 运行“规则”,记录 2 的“规则”也会被触发。只有在记录 1 的“规则”操作完成后,才会检查是否需要修改记录 2 处的代码。

function MasterGet() {
    var countCheckRule = 0;
    connection.query(
    'SELECT * FROM MASTER',
    function selectCb(error, rows, fields) {
        if (error) {
          console.log('Log 045 - GetData Error: ' + error.message);
          return;
        }
            
        for (var i = 0; i < rows.length; i++) {
            console.log(+ rows[i].INDEX1);
            var firstResult = rows[i];
            rules.checRules(firstResult, myhttp, function (rules_res) {
            firstResult.rules = rules_res;
                })
        }
    });            
    countCheckRule++;
    setTimeout(funcL, 4000);
};
 


Any guidance will help.  Thanks

添加到问题中: rules.checrules 编码如下:

exports.checRules = function (A, myhttp, _callback) {
var objrules = { 'rule12': false };
    
function rule11() {
        if (A.NQ > 0 && A.PSQ > 0) {
            objrules.rule11 = true;
            if (config.execute) {
                modifyOrder('S', 'A.BQ', A.TS);
                }
        } else {
            objrules.rule11 = false;
            
        }
    }

    rule11(); 

    _callback(objrules);
}

所以在第一条记录的循环中,它检查 rule11,如果 rule11 为真,那么它必须使用给定的变量执行 'modifyOrder',在 'modifyOrder' 完成后,然后返回循环并检查第 2 次记录。如果第一条记录的 Rule11 为假,那么它应该自动返回循环并检查第二条记录。

目前通过给定的更改,在“modifyOrder”完成之前触发第二次记录检查。也许问题是代码不等待来自“modifyOrder”的回调?是这个问题吗?如果启动,如何让代码等到“modifyOrder”完成。

【问题讨论】:

    标签: node.js loops callback


    【解决方案1】:

    此代码可能会解决您的问题。 这种问题符合js的异步性。

    function asyncLoop(i, rows, cb) {
    if (i < rows.length) {
        rules.checRules(rows[i], myhttp, function (rules_res) {
            console.log(rules_res);
            asyncLoop(i + 1, rows, cb);
            //your code
        });
       } else {
        cb();
      }
    }
    
    function MasterGet() {
    connection.query(
        'SELECT * FROM MASTER',
        function selectCb(error, rows, fields) {
            if (error) {
                console.log('Log 045 - GetData Error: ' + error.message);
                return;
            }
            asyncLoop(0, rows, () => {
                //after async loop complete...
            });
        });
     countCheckRule++;
     setTimeout(funcL, 4000);
    }
    

    【讨论】:

    • 感谢您的意见。我仍然无法让它工作。我在原始帖子中添加了更多细节,以尝试更好地解释问题。希望你能帮忙。
    • 我需要 moor 信息 :-( ,但如果 modifyOrder 是异步的(执行需要一些时间),您可以使用异步等待。没有完整的 conde 审查,我无法帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多