异步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)