蓝鸟模式嘲笑与syncronous代码的asynchronous承诺

我刚刚开始使用蓝鸟(和更一般的节点)。

我想创build一些模拟(最终会是http或数据库调用)。

所有关于反模式的讨论让我着急:-)

那么这是一个合理的方法将这个同步代码转换为承诺?

我在这里有两个简单的function。 第二个叫第一个(不是产品服务的方式),但它是嵌套承诺的例证。

// mock function to return a promise of a collection var getTestPatients = function(params) { return new Promise(function(resolve, reject) { setTimeout(function() {resolve(test_patients);}, 200); }) }; // mock function to return a promise of an object var getTestPatient = function(params) { return getTestPatients().then(function(patients) { // wouldnt get entire patient list in prod - but this works for a mock var patient = _.find(patients, {urn: params.urn}); if (patient) { patient.reviews = testReviews(params.uid); } else { throw new Error('patient not found'); } return Promise.resolve(patient); }); }; 

这些事情展示了一些事情:

  • 造成假延迟
  • 从同步代码创build一个承诺
  • 在一个承诺的function内操纵承诺结果
  • 抛出错误

所以我可能犯了很多错误的事情。

我怎么办? 这里有什么反模式? 或其他菜鸟错误?

没有反模式,没有错误在这里看到。 但是,有两件事情可以改善:

  • 当你发现自己使用Promise构造函数时,首先尝试find一个更简单的方法。 是否已经有一个函数能够为所需的任务返回一个承诺? setTimeout是一个真正的基于callback的API,所以这里没有 ,但是考虑到你使用的是蓝鸟,你可以通过使用Promise.delay帮助函数来移除这个boilderplate:

     function getTestPatients = function(params) { return Promise.delay(test_patients, 200); } 
  • 在这个处理程序中调用Promise.resolve是不必要的。 就像你可以throwexception一样,你可以return普通的值,它们将被自动包装。 所以看起来更清洁就是

     return patient;