我正在使用async
和promise
来运行播种脚本,但是如果所有的播言都是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();
});
答案 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()
并让整个过程继续。