异步Javascript/async:应该立即返回而不是中断函数吗?
对项目使用异步Javascript/async:应该立即返回而不是中断函数吗?,javascript,asynchronous,loopbackjs,Javascript,Asynchronous,Loopbackjs,对项目使用环回。 以下函数是通过async库触发的三个任务之一: async.parallel([ function(cb) { find_car(cb); }, function(cb) { find_parts(cb); }, function(cb) { find_records(cb); } ], function(err, results) { //handl
环回
。
以下函数是通过async
库触发的三个任务之一:
async.parallel([
function(cb) {
find_car(cb);
},
function(cb) {
find_parts(cb);
},
function(cb) {
find_records(cb);
}
], function(err, results) {
//handle results
});
//inside find_car
Car.find({where: query}, function(err, cars) {
if (err) {
logger.error(err);
return callback(err);
}
if (cars && cars.length > 0) {
for (var i=0; i<cars.length; i++) {
var car = cars[i];
car.owner(function(err, owner) {
if (err) {
logger.error(err);
return callback(err, null);
}
if (owner) {
var msg = "A car with " + field + " " + value + " is already in the DB.";
return callback(msg, null); // --> async FIRES EXCEPTION HERE
}
return callback(null, true);
});
}
} else {
return callback(null, true);
}
});
return语句结束函数执行并指定要执行的值
返回给函数调用方。“
因此,我希望在我第一次调用回调后,函数执行应该立即中断,函数find\u car
立即返回,不允许任何进一步的代码执行
相反,我得到了一个例外:
/home/me/prj/gfh/src/loopback/node_modules/loopback/node_modules/continuation-local-storage/context.js:78
throw exception;
^
Error: Callback was already called.
at /home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:43:36
at /home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:718:17
at /home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:167:37
at /home/me/prj/gfh/src/loopback/common/models/car.js:279:15
at /home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/lib/relation-definition.js:1490:11
at /home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/lib/dao.js:1548:5
at Object.forward (/home/me/.nvm/versions/node/v0.12.7/lib/node_modules/strongloop/node_modules/strong-agent/lib/proxy.js:79:23)
at eval (eval at wrap (/home/me/.nvm/versions/node/v0.12.7/lib/node_modules/strongloop/node_modules/strong-agent/lib/proxy.js:197:20), <anonymous>:3:21)
at /home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/lib/dao.js:1479:9
at done (/home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:167:19)
/home/me/prj/gfh/src/loopback/node_modules/loopback/node_modules/continuation local storage/context.js:78
抛出异常;
^
错误:已调用回调。
at/home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:43:36
at/home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:718:17
at/home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:167:37
at/home/me/prj/gfh/src/loopback/common/models/car.js:279:15
at/home/me/prj/gfh/src/loopback/node_modules/loopback datasource juggler/lib/relational definition.js:1490:11
at/home/me/prj/gfh/src/loopback/node_modules/loopback datasource juggler/lib/dao.js:1548:5
在Object.forward(/home/me/.nvm/versions/node/v0.12.7/lib/node_modules/strongloop/node_modules/strong agent/lib/proxy.js:79:23)
在评估时(在包装时评估(/home/me/.nvm/versions/node/v0.12.7/lib/node_modules/strongloop/node_modules/strong agent/lib/proxy.js:197:20),:3:21)
at/home/me/prj/gfh/src/loopback/node_modules/loopback datasource juggler/lib/dao.js:1479:9
完成时(/home/me/prj/gfh/src/loopback/node_modules/loopback datasource juggler/node_modules/async/lib/async.js:167:19)
您调用回调cars.length
次,因为您调用car.owner
的次数相同,并且提供的函数存在cars.length
实例
每个回调函数迟早都会调用回调函数
,这将导致一个错误
使用return
语句退出特定实例并不重要。其他实例仍在运行,并允许以相同的方式调用回调
唯一可以正常工作的情况是汽车。出于明显的原因,
长度为0或1。从返回所在的上下文来看,“应该返回而不是立即中断功能吗?”是的,但您的代码不是这样。您从回调返回,这是非常不同的。到那时,循环已完成运行。
/home/me/prj/gfh/src/loopback/node_modules/loopback/node_modules/continuation-local-storage/context.js:78
throw exception;
^
Error: Callback was already called.
at /home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:43:36
at /home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:718:17
at /home/me/prj/gfh/src/loopback/node_modules/async/lib/async.js:167:37
at /home/me/prj/gfh/src/loopback/common/models/car.js:279:15
at /home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/lib/relation-definition.js:1490:11
at /home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/lib/dao.js:1548:5
at Object.forward (/home/me/.nvm/versions/node/v0.12.7/lib/node_modules/strongloop/node_modules/strong-agent/lib/proxy.js:79:23)
at eval (eval at wrap (/home/me/.nvm/versions/node/v0.12.7/lib/node_modules/strongloop/node_modules/strong-agent/lib/proxy.js:197:20), <anonymous>:3:21)
at /home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/lib/dao.js:1479:9
at done (/home/me/prj/gfh/src/loopback/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:167:19)