蓝鸟模式嘲笑与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
是不必要的。 就像你可以throw
exception一样,你可以return
普通的值,它们将被自动包装。 所以看起来更清洁就是return patient;