函数仍在异步调用.我做错了什么

Functions are still being called asynchronously. What am I doing wrong?

本文关键字:错了 什么 调用 异步 函数      更新时间:2023-09-26

我的代码应该下载从我们学校数据库中导出的 5 个文件,然后基于第一次导出运行查询(其他四个文件会有查询,并且有三所学校,所以我的函数需要可扩展)。

我有一个名为"download"的函数和另一个名为"updateSchedule"的函数。这两个函数单独工作。

var download = function(file){
    var deferred = q.defer();
    var i = 1;
    var ftpGet = function(){
        var number = i++;
        toString(number);
        filename = file+number+'.csv';
        ftp.get(filename, filename, function(hadErr){
            if (hadErr){
                console.error('There was an error retrieving ' + filename);
            }else{
                console.log(filename + ' downloaded');
                if(i <= 5){
                    ftpGet();
                }else{
                    deferred.resolve();
                }
            }
        });
    }
    ftpGet();  
    return deferred.promise;
}
var updateSchedule = function(school, school_id){
    var deferred = q.defer();
    console.log('');
    connectionpool.getConnection(function(err, connection){
        if(err){
            console.error('CONNECTION error: ', err);
        }else{
            connection.query('DELETE FROM schedule WHERE school_id = "'+school_id+'"', function(err, rows){
                if (err) console.error(err);
                var path = './'+school+'_export1.csv';
                var reader = csv.createCsvFileReader(path, {'separator': ',','quote': '"','excape': '"','comment': ''});
                reader.addListener('data',function(data){
                    connection.query('INSERT INTO schedule SET section_id = "'+data[0]+'", student_id = "'+data[1]+'", course_number = "'+data[2]+'", period = "'+data[3]+'", teacher_id = "'+data[4]+'", school_id = "'+school_id+'"', function(err, rows){
                        if (err) console.error(err);
                        deferred.resolve();
                    }); 
                });
            });
            connection.release();
            console.log(school+' schedule updating...');
        }
    });
    return deferred.promise;
}

但是,当我使用 promise 调用它们时,我收到一条错误消息,说它无法打开文件。我做错了什么?

download('lca_export').then(updateSchedule('lca', '517'));

更改以下内容:

download('lca_export').then(updateSchedule('lca', '517'));

对此:

download('lca_export').then(function() {
    updateSchedule('lca', '517');
});

您立即调用updateSchedule()并将结果传递给.then(),而不是将函数引用传递给稍后可以调用的.then()。 因此,updateSchedule()download()完成其工作之前就正在运行。 这是一个非常常见的错误。 请记住,如果函数名称后面有括号,它将立即执行。 如果它只是一个函数名称或没有参数的匿名声明,那么您正在传递函数引用。


要清理的其他一些事项:

  1. filename前面添加var,使其成为局部变量而不是隐式全局变量。
  2. 删除toString(number)。 充其量它根本不需要它,并且没有做任何事情,因为您没有将结果分配给任何东西。 在最坏的情况下,它会导致错误,因为没有功能toString()。 仅供参考,数字在添加到字符串时会自动转换为字符串,因此您无需手动执行此操作。