使用所有被拒绝的异步和承诺会导致异步永远不会完成

时间:2014-07-11 09:22:02

标签: javascript node.js asynchronous promise

我正在使用asyncpromise来运行播种脚本,但是如果所有的播言都是reject,则脚本永远不会完成。

由于这是一个播种脚本,它的设置不会使alredy拥有数据的模型成为种子。

这是(删节)我的代码

知道我错过了什么吗?

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();
});

1 个答案:

答案 0 :(得分:2)

在您的代码中,如果您拒绝拨打seed(),那么您的代码将转到.then()中拒绝处理程序,您将调用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()更改为仅在出现严重错误而无法继续处理时才拒绝。

虽然有许多不同的方法可以使用承诺,但是对于严重失败而保留拒绝可能更为常规,您无法继续这意味着将seed()函数更改为reject()如果有的话一个严重的错误。当它只是因为工作已经完成而发现它没有任何事情要做时,它只会resolve()并让整个过程继续。

相关问题