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-这是一个很好的观点,但是使用异步
我可以将另一个模型添加到我的数组中,瞧。也许放弃承诺结构反而会简化事情。你可以。然后用承诺,得到同样的中提琴