以下是我的节点脚本的代码片段:
pool.getConnection(function(err, maria_connection) {
maria_connection.query(' CREATE TABLE Currency(uuid VARCHAR(10),name VARCHAR(12),PRIMARY KEY(uuid), UNIQUE(name))')
async.series({
one: function(callback){
var currency_ids = []
request('host_url', function (error, response, html) {
if (!error && response.statusCode == 200) {
.....used maria_connection here to save some data
}
})
setTimeout( function(){
callback(null, 1);
},20000)
},
two: function(callback){
maria_connection.query({
sql: 'SELECT uuid FROM Currency'
},
function (error, results, fields){
console.log(error)
add_currencies( results )
}
)
setTimeout( function(){
callback(null, 2);
},20000)
},
three: function(callback){
console.log('third series called')
maria_connection.query({
sql: 'SELECT * FROM Brokers'
},
function (error, results, fields){
if (error) throw error;
console.log(results)
}
)
setTimeout( function(){
callback(null, 3);
},20000)
},
four: function(callback){ process.exit(-1); }
}, function(error, results) { // <--- this is the main callback
maria_connection.release();
});
现在系列中的前两个项目工作正常,但是当调用第三个函数时,控制台日志会打印文本“第三个系列名为”,但maria_connection不起作用。它甚至没有任何错误。
答案 0 :(得分:0)
我认为您在使用async.js
和throw()
时没有正确使用setTimeout()
。你不应该同时使用它们。
例如,您对setTimeout()
的使用假定当前任务最多需要20秒 - 但如果没有,那该怎么办?如果您致电callback()
,您将在当前任务完成之前开始下一个任务。您可能同时运行两个查询(这违背了使用async.series()
)的想法。
最好在确保任务完成(或返回错误)时触发callback()
。如果发生错误,而不是抛出错误,请将其传递到callback
,以便它可以优雅地停止async.series()
。
async.series({
one: function(callback){
var currency_ids = []
request('host_url', function (error, response, html) {
if (error)
return callback(error);
if (response.statusCode != 200)
return callback(new Error('not 200'));
// .....used maria_connection here to save some data (*)
});
},
two: function(callback){
maria_connection.query({ sql: 'SELECT uuid FROM Currency' }, function (error, results, fields){
if (error)
return callback(error);
add_currencies(results); // (*)
});
},
three: function(callback){
console.log('third series called')
maria_connection.query({ sql: 'SELECT * FROM Brokers' }, function (error, results, fields){
if (error)
return callback(error);
console.log(results)
callback();
});
}
}, function(error, results) {
// if an error occurs, it will come down here
// if all tasks are completed successfully, it will also come down here too
console.log(error, results);
maria_connection.release();
process.exit(-1);
});
如果(*)
是异步操作,请确保在操作完成时调用回调。例如,如果add_currencies()
是异步操作,则您很可能希望将其写为
function add_currencies(results, callback) {
doAsyncOperation(results, function (error) {
if (error)
return callback(error);
callback();
});
// or simply doAsyncOperation(results, callback);
}
重点是始终在每项任务中触发callback
至少一次。如果没有,通常情况就要开始了。