试图找出蓝鸟做承诺流的方式

时间:2017-03-15 19:35:22

标签: javascript promise bluebird

我试图找出正确的方法来实现宣传 - 更具体地说是使用蓝鸟。我提出了一些使用新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);
        });
   })
}

但是我觉得我并没有从这种方式中获得很多蓝鸟,在浏览完文档后,似乎这是一种应该避免的反模式。我将如何制作例如这种流动更蓝鸟风格或更好的一般承诺?

2 个答案:

答案 0 :(得分:2)

如果User.createAsyncUser.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或更高的节点。