【发布时间】:2016-02-05 18:42:28
【问题描述】:
我刚刚开始使用 bluebird(以及更普遍的 node)。
我想创建一些模拟(最终将是 http 或数据库调用)。
所有关于反模式的讨论都让我感到焦虑:-)
那么这是将同步代码转换为 Promise 的合理方法吗?
我在这里有两个简单的功能。第二个调用第一个(不像 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);
});
};
这些展示了一些事情:
- 制造假延迟
- 从同步代码创建承诺
- 在做出承诺的函数中操作承诺结果
- 抛出错误
所以我可能做错了很多事情。
我是怎么做的?这里有任何反模式吗?还是其他菜鸟错误?
【问题讨论】:
-
将
return Promise.resolve(patient);更改为return patient;。无需创建新的已解决承诺并返回它。您可以只返回值本身。 -
仅供参考,如果您知道这是有效的代码并且想要改进建议,那么您可以将其发送至codereview.stackexchange.com。
-
同时使用
getTestPatient和getTestPatients作为函数名,阅读代码时容易混淆。 -
非常感谢@jfriend00 将
return Promise.resolve(patient);更改为return patient;确实有效!并且感觉更好:-) - 我可以这样做,因为我已经在then()中,对吗? (顺便说一句,您应该作为答案发布,不是吗?) -
是的,
.then()处理程序的返回值变成了 promise 的解析值。类似地,抛出的异常值成为 promise 的拒绝值。正是.then()promise 基础结构调用了您的.then()处理程序,从而接收返回值或捕获导致这种情况发生的异常。