函数仍在异步调用.我做错了什么
Functions are still being called asynchronously. What am I doing wrong?
我的代码应该下载从我们学校数据库中导出的 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()
完成其工作之前就正在运行。 这是一个非常常见的错误。 请记住,如果函数名称后面有括号,它将立即执行。 如果它只是一个函数名称或没有参数的匿名声明,那么您正在传递函数引用。
要清理的其他一些事项:
- 在
filename
前面添加var
,使其成为局部变量而不是隐式全局变量。 - 删除
toString(number)
。 充其量它根本不需要它,并且没有做任何事情,因为您没有将结果分配给任何东西。 在最坏的情况下,它会导致错误,因为没有功能toString()
。 仅供参考,数字在添加到字符串时会自动转换为字符串,因此您无需手动执行此操作。
相关文章:
- 正在尝试为Docpad网站设置Lunr全文搜索插件.我做错了什么
- 重新加载重复数据失败,我做错了什么
- 我做错了什么
- Google Apps 脚本为 getLastRow 抛出电子邮件失败通知,我做错了什么
- Javascript语法 - 我做错了什么
- 角度灯箱不起作用.我做错了什么
- 在这个猫鼬独特的保存前验证中,我做错了什么
- 简单的Youtube iframe API就在文档中,我做错了什么
- 我正在尝试实现一个AJAX调用.我做错了什么
- 我对这个动态查询做错了什么
- 我在jQuery事件处理和隐藏/显示图像元素方面做错了什么
- 闭包中的本地变量从外部更改.这是一个javascript错误,或者我做错了什么
- JS离线检测?我做错了什么
- Jquery自动完成不是't工作.我做错了什么
- 是ngRouter的角度错误还是我做错了什么
- jQuery Toggle——我做错了什么
- javascript原型,我做错了什么
- 超级初学者JavaScript..我做错了什么
- 我在这里做错了什么?否则,如果
- Javascript和HTML - 添加一个下拉菜单,我在这里做错了什么