我刚刚开始使用蓝鸟(更常见的是节点)。
我想创建一些模拟(最终将是http或数据库调用)。
所有关于反模式的讨论让我感到焦虑: - )
这是将这种同步代码转换为承诺的合理方法吗?
我这里有两个简单的功能。第二个调用第一个(不是prod服务的方式),但它可以作为嵌套承诺的例证。
// 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);
});
};
这些证明了以下几点:
所以我可能犯了很多错误。
我是怎么做的?这里有任何反模式吗?或其他菜鸟错误?
答案 0 :(得分:1)
没有反模式,也没有错误看到这里。但是,您可以改进两件事:
每当您发现自己使用Promise
构造函数时,首先尝试找到一种更简单的方法。是否已有一个函数确实返回了对所需任务的承诺? setTimeout
是一个真正的基于回调的API,所以这里没有错误,但鉴于您正在使用Bluebird,您可以通过使用Promise.delay
帮助程序删除该boilderplate功能:
function getTestPatients = function(params) {
return Promise.delay(test_patients, 200);
}
不需要在Promise.resolve
处理程序中调用then
。正如您可以throw
例外一样,您可以return
普通值,它们将自动换行。看起来更清洁只是
return patient;