NodeJS违反诺言

使用ES6 Promise,如何在以下场景中打破它?

addClient: function(request, response, next) { var id = mongo.validateString(request.body.id); mongo.Test.findOne({ id: id }) .then(client => { if (client) { // want to break here response.status(400).send({ error: 'client already exists' }); } else { return auth.hashPassword(mongo.validateString(request.body.secret)); } }) .then(hashedSecret => { // gets executed even if I don't return anything return new mongo.Test({ name: mongo.validateString(request.body.name), id: id, secret: hashedSecret }).save(); }) .then(doc => { return response.status(201).send({ client: { id: doc._id } }); }) .catch(err => { return next(err); }); } 

我还没有find明确的文件说明如何打破这一点。 而不是链接then我可以在第一个内部,但在更复杂的请求,这将是很好的能够让他们链接。

 // gets executed even if I don't return anything return new mongo.Test({ name: mongo.validateString(request.body.name), id: id, secret: hashedSecret }).save(); 

即使不返回任何东西,也会执行此操作,因为此类事件的默认返回值是undefined 。 假定用undefinedparsing代码

如果这个值不是一个承诺,包括未定义的,它就成为相关承诺的履行价值

Mozilla文档在这个

你可以通过尽早的拒绝来打破Promise链。

 addClient: function (request, response, next) { var id = mongo.validateString(request.body.id); mongo.Test.findOne({ id: id }).then(client => { if (client) { // reject with a type return Promise.reject({ type: 'CLIENT_EXISTS' }); } return auth.hashPassword(mongo.validateString(request.body.secret)); }).then(hashedSecret => { // gets executed even if I don't return anything return new mongo.Test({ name: mongo.validateString(request.body.name), id: id, secret: hashedSecret }).save(); }).then(doc => { return response.status(201).send({ client: { id: doc._id } }); }).catch((err) => { // check type if (err.type === 'CLIENT_EXISTS') { return response.status(400).send({ error: 'client already exists' }); } return next(err); }); } 

如果你想打破一个承诺链,也就是不执行下面的链接承诺链接,你可以通过返回一个永远不会解决的承诺,将一个未解决的承诺注入链中。

 new Promise((resolve, reject) => { console.log('first chain link executed') resolve('daniel'); }).then(name => { console.log('second chain link executed') if (name === 'daniel') { return new Promise(() => { console.log('unresolved promise executed') }); } }).then(() => console.log('last chain link executed')) // VM492:2 first chain link executed // VM492:5 second chain link executed // VM492:8 unresolved promise executed