2017-03-15 23 views
0

我想弄清楚做promisification的正确方法 - 更具体地说,使用蓝鸟。我想出了一些代码,使用新的承诺:试图找出蓝鸟做承诺流的方式

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); 
     }); 
    }) 
} 

但我觉得我没有得到太多了蓝鸟这种方式,并通过它似乎像这样的文档浏览后的事应该避免的反模式。我将如何去做这个流程更多的蓝鸟风格或更好的promisified一般?

+0

避免['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! – Bergi

回答

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()等待承诺。

上面的代码等同于其他答案。异步功能需要节点7.6或更高。

2

如果User.createAsyncUser.findOneAsync返回承诺,则不需要将它们包装在新的承诺中。只是返回你的函数返回的承诺:

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); 
     } 
    }); 
} 
+0

请注意,这可以通过最新Node版本支持的'async'功能进一步改进。您在这里没有使用任何Bluebird特定功能。 –

+0

谢谢,直到现在我还没有完全得到promisify的观点。我想你是对的,我应该看看异步/等待结构。 –

+0

@MadaraUchiha这不一定是一种改进。这对于做同样的事情只是一种不同的语法。我更喜欢纯粹的承诺解决方案,因为它在任何地方都有支持承诺(如果OP使用蓝鸟,这是任何地方)。 – SimpleJ