我试图找出正确的方法来实现宣传 - 更具体地说是使用蓝鸟。我提出了一些使用新Promise的代码:
function createUser(data) {
return new Promise((resolve, reject) => {
User.createAsync(user)
.then((doc) => {
resolve(doc);
})
.catch((err) => {
reject(err);
});
});
}
function create(data) {
return new Promise((resolve, reject) => {
User.findOneAsync({username: data.username})
.then((user) => {
if (user) {
resolve(`Username ${data.username} is already taken`);
} else {
createUser(data)
.then((user) => {
resolve(user);
})
}
})
.catch((err) => {
reject(err);
});
})
}
但是我觉得我并没有从这种方式中获得很多蓝鸟,在浏览完文档后,似乎这是一种应该避免的反模式。我将如何制作例如这种流动更蓝鸟风格或更好的一般承诺?
答案 0 :(得分:2)
如果User.createAsync
和User.findOneAsync
返回承诺,您就不需要将它们包含在新的承诺中。只需返回函数返回的promise:
function createUser(data) {
return User.createAsync(data);
}
function create(data) {
return User.findOneAsync({username: data.username})
.then((user) => {
if (user) {
throw new Error(`Username ${data.username} is already taken`);
} else {
return createUser(data);
}
});
}
答案 1 :(得分:1)
添加到SimpleJ的答案中,您可以使用异步函数执行以下操作,以获得更好的代码可读性:
function createUser(data) {
return User.createAsync(data);
}
// async functions!
// destructuring!
async function create({username}) {
// short literals!
const user = await User.findOneAsync({username});
if (user) { throw new Error(`Username ${username} is already taken`); }
return createUser(data);
}
这为您提供了一个非常平坦,几乎同步的代码。请注意await
之前的User.findOneAsync()
等待Promise。
上面的代码等同于其他答案。异步功能需要7.6或更高的节点。