javascript - Node.js 异步系列无法按顺序工作

标签 javascript node.js asynchronous sequence

我尝试使用 Async Node.js 模块连续执行 2 个循环,第一个循环在另一个循环之前。

async.series([
    insertSkill,//first loop
    insertBehaviours//second loop
], function(err, results){
        console.log(results);//print results
    });

这是每个函数中的代码,为了更好的可读性,我删除了一些代码

function insertSkill(fnCallback){
    async.eachSeries(Object.keys(behaviours), function (aSkill, callback){
        if (aSkill.indexOf('skillid') > -1) {
            if (behaviours[aSkill] == null || behaviours[aSkill] == "") {}

            connection.get().query('SELECT skill_id FROM skills WHERE skill_id = ?', num, function (err, skillResults) {

                if (skillTitle != null || skillTitle != "") {

                    connection.get().query('INSERT INTO skills SET ?', [skill], function (err, skillResults) {

                        if (err) {}   
                     else {
                            console.log("1");//PRINTING AFTER 2, DONT WANT THAT!!!                        }
                    });
                }
            });
        }
        callback(null);
    },fnCallback);
}

第二个函数

//Second Function
function insertBehaviours(fnCallback){
    async.eachSeries(Object.keys(behaviours), function (aBehaviour, secondCallback) {
        if (aBehaviour.indexOf('behaviourid') > -1) {
            if (behaviours[aBehaviour] == null || behaviours[aBehaviour] == "") {
            console.log("2");//PRINTING BEFORE 1, DONT WANT THAT!!!

                });
            }
        }
        secondCallback(null);
    },fnCallback);
}

问题是,第二个函数 insertBehaviours 在 insertSkills 之前先发生。我希望 insertSkills 首先发生并在 insertBehaviours 之前发生

最佳答案

原因是您的第一个函数,insertSkill 中有几个异步方法。但是,您在这些方法有机会完成之前就调用了迭代器上的回调。您的 insertSkill 方法应该看起来更像这样:

function insertSkill(fnCallback){
    async.eachSeries(Object.keys(behaviours), function (aSkill, callback){
        if (aSkill.indexOf('skillid') > -1) {
            if (behaviours[aSkill] == null || behaviours[aSkill] == "") {}

            connection.get().query('SELECT skill_id FROM skills WHERE skill_id = ?', num, function (err, skillResults) {

                if (skillTitle != null || skillTitle != "") {

                    connection.get().query('INSERT INTO skills SET ?', [skill], function (err, skillResults) {

                        if (err) {}   
                     else {
                            console.log("1");//PRINTING AFTER 2, DONT WANT THAT!!!                         
                            callback(null); // notice I moved this.
                          }
                    });
                }
            });
        }
    },fnCallback);
}

因为只有在两条 SQL 语句运行后才会调用回调函数。

关于javascript - Node.js 异步系列无法按顺序工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37759582/

相关文章:

javascript - 什么构成了异步 JavaScript?

javascript - 确定异步执行何时完成

javascript - 如何在模态中将焦点设置为输入?

javascript - Js中阻止函数多次运行的最佳方法是什么

node.js - 如何在使用函数接收到集合的创建事件时更新/插入云 Firestore 中的其他文档

node.js - Firebase 的云函数 : 'Error: could not handle the request'

javascript - 如何迭代 HTMLCollection?

javascript - 使用 Bootstrap 时导航栏失真

javascript - 为什么将 `done` 函数传递给 Karma 的服务器时会出现 gulp 错误?

c# - 可测试异步操作的体面模式?