Javascript 使用Async和所有被拒绝的承诺将导致Async永远无法完成

Javascript 使用Async和所有被拒绝的承诺将导致Async永远无法完成,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我正在使用async和promise运行一个种子脚本,但是在所有promse都拒绝的情况下,脚本永远不会完成 因为它是一个种子脚本,所以它设置为不为已经有数据的模型种子 这是我的代码(节略) 知道我错过了什么吗 seed = function(collectionName, data) { return new Promise(function(fulfill, reject) { var collection = collections[collectionName]; c

我正在使用
async
promise
运行一个种子脚本,但是在所有promse都
拒绝
的情况下,脚本永远不会完成

因为它是一个种子脚本,所以它设置为不为已经有数据的模型种子

这是我的代码(节略)

知道我错过了什么吗

seed = function(collectionName, data) {
  return new Promise(function(fulfill, reject) {
    var collection = collections[collectionName];
    collection.find().exec(function(err, found) {
      if (found.length > 0) {
        console.log("There are", found.length, collectionName, "records in the database already.");
        reject();
      } else {
        collection.createEach(data, function(err, models) {
          if (err || _.isUndefined(models)) {
            console.log("Could not create", collectionName, "collection!");
            reject();
          } else {
            collection.find().exec(function(err, found) {
              fulfill(found);
            });
          }
        });
      }
    });
  });
};

run = function(models, done) {
  async.each(models, function(modelName, next) {
    seed(modelName, modelData[modelName]).then(function(codes) {
      console.log("Seeded", codes.length, modelName, "records.");
      next();
    }, function(err){
      console.log("Seeding of", modelName, "failed", err.stack);
      done(err);
    });
  }, done);
};

run(["widget", "thingo", "dooverlackey"], function(err){
  if (err) console.error("Completed with errors", err);
  else console.log("Completed without errors");
  process.exit();
});

在代码中,如果在调用
seed()
时拒绝,那么代码将转到
中的拒绝处理程序。然后()
在那里调用
done()
。因此,您自己的结构告诉它,如果在该代码中遭到拒绝,则停止处理:

seed(modelName, modelData[modelName]).then(function(codes) {
  console.log("Seeded", codes.length, modelName, "records.");
  next();
}, function(err){
  console.log("Seeding of", modelName, "failed", err.stack);
  // upon fail from seed, stop processing
  done(err);
});
您可以更改拒绝处理程序(传递给
.then()
)的第二个回调,以便它继续处理,或者您可以将
种子()
更改为仅在出现无法继续处理的严重错误时才拒绝


虽然有许多不同的使用承诺的方法,但对于无法继续的严重故障保留拒绝可能更为传统,这意味着在出现严重错误时将
seed()
函数更改为仅
reject()
。当它仅仅因为工作已经完成而发现它没有任何事情要做时,它只会
resolve()
,让整个过程继续。

更进一步,如果我将错误消息传递给
reject(“我的错误”)
,那么整个批次在第一个错误时停止,这也不是我想要的。我只想让它跳过任何已经有数据的模型。承诺已经提供了异步聚合和结构化。这里确实没有理由使用异步模块。你可以简单地
。然后
在for循环中不使用异步链接它们。谢谢Benjamin-这是一个很好的观点,但是使用
异步
我可以将另一个模型添加到我的数组中,瞧。也许放弃承诺结构反而会简化事情。你可以。然后用承诺,得到同样的中提琴